Crear capturas de retina mediante progtwigción que da como resultado una image sin retina

Estoy tratando de tomar una captura de pantalla retina programáticamente y he probado todos los methods encontrados en línea, pero no pude lograr que la captura de pantalla sea retina.

Entiendo la siguiente API privada:

UIGetScreenImage(); 

No se puede utilizar ya que Apple rechazará su aplicación. Sin embargo, este método devuelve exactamente lo que necesito (pantalla de 640×960 de la pantalla).

He probado este método en mi iPhone 4, así como el simulador iPhone 4 en hardware Retina, pero la image resultante es siempre 320×480.

 -(UIImage *)captureView { AppDelegate *appdelegate = [[UIApplication shanetworkingApplication]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; } 

También he probado la forma recomendada de Apple:

 - (UIImage*)screenshot { // Create a graphics context with the target size // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext CGSize imageSize = [[UIScreen mainScreen] bounds].size; if (NULL != UIGraphicsBeginImageContextWithOptions) UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); else UIGraphicsBeginImageContext(imageSize); CGContextRef context = UIGraphicsGetCurrentContext(); // Iterate over every window from back to front for (UIWindow *window in [[UIApplication shanetworkingApplication] windows]) { if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) { // -renderInContext: renders in the coordinate space of the layer, // so we must first apply the layer's geometry to the graphics context CGContextSaveGState(context); // Center the context around the window's anchor point CGContextTranslateCTM(context, [window center].x, [window center].y); // Apply the window's transform about the anchor point CGContextConcatCTM(context, [window transform]); // Offset by the portion of the bounds left of and above the anchor point CGContextTranslateCTM(context, -[window bounds].size.width * [[window layer] anchorPoint].x, -[window bounds].size.height * [[window layer] anchorPoint].y); // Render the layer hierarchy to the current context [[window layer] renderInContext:context]; // Restore the context CGContextRestoreGState(context); } } // Retrieve the screenshot image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSLog(@"Size: %@", NSStringFromCGSize(image.size)); return image; } 

Pero también devuelve una image no retina: 2012-12-23 19: 57: 45.205 PostCard [3351: 707] tamaño: {320, 480}

¿Hay algo obvio que me falta? ¿Cómo es posible que los methods que se supone que deben tomar retina screenshot me devuelvan capturas de pantalla non retina? ¡Gracias por adelantado!

No veo nada malo en su código. Además de image.size , ¿ha intentado iniciar session en image.scale ? ¿Es 1 o 2? Si es 2, en realidad es una image retina.

UIImage.scale representa la escala de la image. Entonces, una image con UIImage.size 320 × 480 y UIImage.scale 2 tiene un tamaño real de 640 × 960. Del doc de Apple:

Si multiplicas el tamaño lógico de la image (almacenado en la propiedad de size ) por el valor en esta propiedad, obtienes las dimensiones de la image en píxeles.

Es la misma idea que cuando carga una image en un UIImage con el modificador @2x . Por ejemplo:

 a.png (100×80) => size=100×80 scale=1 b@2x.png (200×160) => size=100×80 scale=2