Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIImage from a UIView created with snapshotViewAfterScreenUpdates:

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?

like image 973
carton Avatar asked Nov 25 '13 21:11

carton


1 Answers

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.

like image 117
carton Avatar answered Nov 10 '22 17:11

carton