I am trying to do retina screening programmatically, and I tried every found online approach, but I couldn’t get a screenshot to be a retina.
I understand the following private API:
UIGetScreenImage();
cannot be used because Apple will reject your application. However, this method returns exactly what I need (640x960 screenshots).
I tried this method on my iPhone 4, as well as the iPhone 4 simulator on the retina, but as a result, the image is always 320x480.
-(UIImage *)captureView
{
AppDelegate *appdelegate = [[UIApplication sharedApplication]delegate];
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(appdelegate.window.bounds.size, NO, 0.0);
else
UIGraphicsBeginImageContext(appdelegate.window.bounds.size);
[appdelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSLog(@"SIZE: %@", NSStringFromCGSize(image.size));
NSLog(@"scale: %f", [UIScreen mainScreen].scale);
return image;
}
I also tried the Apple recommended method:
- (UIImage*)screenshot
{
CGSize imageSize = [[UIScreen mainScreen] bounds].size;
if (NULL != UIGraphicsBeginImageContextWithOptions)
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
else
UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
for (UIWindow *window in [[UIApplication sharedApplication] windows])
{
if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
{
CGContextSaveGState(context);
CGContextTranslateCTM(context, [window center].x, [window center].y);
CGContextConcatCTM(context, [window transform]);
CGContextTranslateCTM(context,
-[window bounds].size.width * [[window layer] anchorPoint].x,
-[window bounds].size.height * [[window layer] anchorPoint].y);
[[window layer] renderInContext:context];
CGContextRestoreGState(context);
}
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSLog(@"Size: %@", NSStringFromCGSize(image.size));
return image;
}
But it also returns a non-retinal image: 2012-12-23 19: 57: 45.205 PostCard [3351: 707] size: {320, 480}
- , ? , , , , ?
!