How Do I Take a Screen Shot of a UIView? How Do I Take a Screen Shot of a UIView? objective-c objective-c

How Do I Take a Screen Shot of a UIView?


iOS 7 has a new method that allows you to draw a view hierarchy into the current graphics context. This can be used to get an UIImage very fast.

I implemented a category method on UIView to get the view as an UIImage:

- (UIImage *)pb_takeSnapshot {    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];    // old style [self.layer renderInContext:UIGraphicsGetCurrentContext()];    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return image;}

It is considerably faster then the existing renderInContext: method.

Reference: https://developer.apple.com/library/content/qa/qa1817/_index.html

UPDATE FOR SWIFT: An extension that does the same:

extension UIView {    func pb_takeSnapshot() -> UIImage {        UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)        drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)        // old style: layer.renderInContext(UIGraphicsGetCurrentContext())        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        return image    }}

UPDATE FOR SWIFT 3

    UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)    drawHierarchy(in: self.bounds, afterScreenUpdates: true)    let image = UIGraphicsGetImageFromCurrentImageContext()!    UIGraphicsEndImageContext()    return image


I think you may want renderInContext, not drawInContext. drawInContext is more a method you would override...

Note that it may not work in all views, specifically a year or so ago when I tried to use this with the live camera view it did not work.


You need to capture the key window for a screenshot or a UIView. You can do it in Retina Resolution using UIGraphicsBeginImageContextWithOptions and set its scale parameter 0.0f. It always captures in native resolution (retina for iPhone 4 and later).

This one does a full screen screenshot (key window)

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];CGRect rect = [keyWindow bounds];UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);CGContextRef context = UIGraphicsGetCurrentContext();[keyWindow.layer renderInContext:context];   UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();

This code capture a UIView in native resolution

CGRect rect = [captureView bounds];UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);CGContextRef context = UIGraphicsGetCurrentContext();[captureView.layer renderInContext:context];   UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();

This saves the UIImage in jpg format with 95% quality in the app's document folder if you need to do that.

NSString  *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/capturedImage.jpg"]];    [UIImageJPEGRepresentation(capturedImage, 0.95) writeToFile:imagePath atomically:YES];