Search code examples
iphonecocoa-touch

How to use UIGraphicsBeginImageContextWithOptions?


I'm trying to adapt THIS question to work with a retina display. Here's how I figured out how to work with retina graphics for UIGraphicsBeginImageContext.

if (UIGraphicsBeginImageContextWithOptions != NULL)
{
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0f);
}
else
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
}

However, when I use it the image looks really huge and doesn't scale down to fit the display. Any ideas how I can tell it to resize the captured image to fit the boxes? (Please refer to the other question to understand what I mean).


Solution

  • I've written this code to perform exactly the same thing described in the other post. It works on any iOS device with at least iOS 3.1.

    _launcherView is the view that need to be photographed

    CGFloat scale = 1.0;
    if([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) {        
        CGFloat tmp = [[UIScreen mainScreen]scale];
        if (tmp > 1.5) {
            scale = 2.0;    
        }
    } 
    
    if(scale > 1.5) {
        UIGraphicsBeginImageContextWithOptions(_launcherView.frame.size, NO, scale);
    } else {
        UIGraphicsBeginImageContext(_launcherView.frame.size);
    }
    
    [_launcherView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    CGRect upRect = CGRectMake(0, 0, _launcherView.frame.size.width*scale, (diff - offset)*scale);
    CGImageRef imageRefUp = CGImageCreateWithImageInRect([screenshot CGImage], upRect);
    [self.screenshot1 setFrame:CGRectMake(0, 0, screenshot1.frame.size.width, diff - offset)];
    [screenshot1 setContentMode:UIViewContentModeTop];
    UIImage * img1 = [UIImage imageWithCGImage:imageRefUp];
    [self.screenshot1 setBackgroundImage:img1 forState:UIControlStateNormal];
    CGImageRelease(imageRefUp);
    
    CGRect downRect = CGRectMake(0, (diff - offset)*scale, _launcherView.frame.size.width*scale, (screenshot.size.height - diff + offset)*scale);
    CGImageRef imageRefDown = CGImageCreateWithImageInRect([screenshot CGImage], downRect);
    [self.screenshot2 setFrame:CGRectMake(0, screenshot1.frame.size.height ,  screenshot2.frame.size.width, _launcherView.frame.size.height - screenshot1.frame.size.height)];
    [screenshot2 setContentMode:UIViewContentModeTop];
    UIImage * img2 = [UIImage imageWithCGImage:imageRefDown];
    [self.screenshot2 setBackgroundImage:img2 forState:UIControlStateNormal];
    CGImageRelease(imageRefDown);