Is it possible to get a UIImage from a UIView created with snapshotViewAfterScreenUpdates
?
A UIView returned from snapshotViewAfterScreenUpdates
looks fine when added as a subview, but the following produces a black image:
UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES];
UIImage *snapshotImage = [self imageFromView:snapshotView];
- (UIImage *)imageFromView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
// [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- same result...
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
It is of course possible to get the image without relying on snapshotViewAfterScreenUpdates
:
UIImage *snapshotImage = [self imageFromView:someView];
Unfortunately, when capturing a complex view, drawViewHierarchyInRect
can't match the speed of snapshotViewAfterScreenUpdates
. I was hoping that it would be faster to get the UIImage
from a view created by snapshotViewAfterScreenUpdates
, is this possible?
The answer seems to be NO and Apple's documentation implicitly confirms this:
If you want to apply a graphical effect, such as blur, to a snapshot, use the
drawViewHierarchyInRect:afterScreenUpdates:
method instead.
It's worth noting that the Implementing Engaging UI on iOS session from WWDC13 lists snapshotViewAfterScreenUpdates
as the fastest method, but uses drawViewHierarchyInRect
in the example code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With