Potrzebuję przechwycić UIView i wszystkie jego subviews do UIImage. Problem polega na tym, że część widoku jest poza ekranem, więc nie mogę korzystać z funkcji przechwytywania ekranu, a kiedy próbuję użyć funkcji UIGraphicsGetImageFromCurrentImageContext(), nie wydaje się ona również przechwytywać podrzędnych. Czy powinien on przechwytywać subviews i robię coś złego? Jeśli nie, czy istnieje inny sposób osiągnięcia tego?Potrzebujesz przechwycić UIView do UIImage, włączając wszystkie subviews
14
A
Odpowiedz
2
Czy oznacza
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer drawInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
nie działa? Jestem pewien, że powinniśmy ...
27
że to właściwa droga:
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Ta metoda to metoda rozszerzenie dla klasy UIImage, a także dbać o dokonaniu wygląd obrazu dobre na przyszłe urządzenia o wysokiej rozdzielczości.
+2
Naprawdę działa !!! – AlexeyVMP
+0
Zaoszczędziłem mój czas :) Dzięki –
0
Oto Swift w wersji 2.x, który powinien działać, jeśli najpierw utworzyć tablicę UIViews aby spłaszczona:
// Flattens <allViews> into single UIImage
func flattenViews(allViews: [UIView]) -> UIImage? {
// Return nil if <allViews> empty
if (allViews.isEmpty) {
return nil
}
// If here, compose image out of views in <allViews>
// Create graphics context
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale)
let context = UIGraphicsGetCurrentContext()
CGContextSetInterpolationQuality(context, CGInterpolationQuality.High)
// Draw each view into context
for curView in allViews {
curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false)
}
// Extract image & end context
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Return image
return image
}
myślę, że skoro każdy 'UIView' dzwoni warstwa opartej' - [CALayer drawInContext: viewContext] 'może pomóc. –