Arda Dtmr
Arda Dtmr

Reputation: 125

UIGraphicsGetImageFromCurrentImageContext in specific CGRect

I want to take screen shot of the specific location in specific size. I found this. But it takes whole screen. Where can i set the CGRect.

UIGraphicsBeginImageContext(self.window.bounds.size);
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Upvotes: 1

Views: 4529

Answers (1)

Jordan Smith
Jordan Smith

Reputation: 10378

I was stuck on this a few days ago actually... Then after a while I managed to come up with a solution! I've implemented it in a category:

#import "UIView+RenderSubframe.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (RenderSubframe)

- (UIImage *) renderWithSubframe:(CGRect)frame {  

    UIGraphicsBeginImageContextWithOptions(frame.size, NO, 0.0);
    CGContextRef c = UIGraphicsGetCurrentContext();

    CGContextConcatCTM(c, CGAffineTransformMakeTranslation(-frame.origin.x, -frame.origin.y));
    [self.layer renderInContext:c];

    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return screenshot;

}

@end

Voila!

If I'm not mistaken, this method doesn't actually render the unneeded part of the view at all, making this much more efficient than cropping the image afterwards.

In your case, you want to apply this category to a UIWindow class rather than a UIView.

Upvotes: 13

Related Questions