2012-09-21 13 views
19

iPhone 5 lanzado, con un nuevo tamaño de pantalla y resolución.Imágenes para la pantalla retina del iphone 5

Cuando usamos imágenes para iPhone 4 (retina), acabamos de agregar "@ 2x" al nombre de la imagen. ¿Alguien me puede decir si es posible agregar diferentes imágenes (fondos, botones, etc.) para la nueva pantalla del iPhone?

Y la segunda pregunta: ¿puedo tener en mi aplicación archivos XIB separados: para iPhone viejo, iPhone nuevo (como para iPhone y iPad)?

¡Gracias!

+1

Debe separar las preguntas diferentes en diferentes preguntas. –

Respuesta

50

He aquí una excepción de mi blog sobre este tema:

[UIImage imageNamed:] carga automáticamente @ versiones 2x de imágenes cuando se ejecuta en un dispositivo de retina. Desafortunadamente, imageNamed: NO cargará automáticamente -568h @ 2x versiones de imágenes cuando se ejecuta en un iPhone 5.

A veces esto no importa, por ejemplo, los iconos y gráficos de pantalla no completa son probablemente los mismos en iPhone 4 & 5. Sin embargo, si tiene imágenes de fondo de pantalla completa o imágenes de fondo de ancho completo/alto para barras de herramientas, etc., tendrá problemas. Es muy probable que sus imágenes de 480 imágenes se alarguen (y, como resultado, probablemente se vean horribles).

Puede comprobar manualmente el tamaño de la pantalla y cargar la imagen de la derecha como esto:

UIImage* myImage; 
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; 
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) { 
    myImage = [UIImage imageNamed:@"myImage-568h.png"]; 
} else { 
    myImage = [UIImage imageNamed:@"myImage.png"]; 
} 

Hay una manera de alterar UIImage imageNamed por lo que no carga automáticamente la imagen de la derecha. Vea el enlace a continuación para más detalles.

Más en: http://pervasivecode.blogspot.co.uk/2012/09/making-apps-work-on-iphone-5-screen-size.html

EDIT: @Sound Blaster & @GrizzlyNetch son derecha, en el código que puedes usar imageNamed: @ "myImage-568h.png"], pero el nombre de archivo real debería haber [email protected] Si no haces esto, entonces la escala es incorrecta, tal como lo dijeron.

+2

Creo que el nombre de la imagen de la derecha es 'myImage-568h.png' - sin @ 2x –

+2

Otra solución se puede encontrar aquí http://angelolloqui.com/blog/20-iPhone5-568h-image-loading –

+1

2Ben: Estoy de acuerdo con Sound Blaster, que el sufijo @ 2x no debería estar allí. Es porque llamarlo con el sufijo no inicializa la escala de imagen correcta para la visualización de retina (imageNamed comprueba si hay un archivo con sufijo y si hay uno, carga la imagen del archivo y establece scale = 2). Intente ejecutar NSLog (@ "% f", [UIImage imageNamed: "Default.png"]. Scale); y NSLog (@ "% f", [UIImage imageNamed: @ "[email protected]"]. scale) en retina device/simulator y debería ver los resultados. – JakubKnejzlik

11

El iPhone 5 no presenta una nueva densidad de píxeles por lo que puede utilizar todas las imágenes de retina que utilizó anteriormente.

Todo lo que necesita para sustentar la nueva resolución del iPhone 5 es hacer que sus vistas se vean por la ventana. Para la mayoría de las vistas, como tableview y scrollview esto no presentará ningún problema.

Además, no es necesario agregar un archivo XIB adicional para la nueva resolución, que tampoco es compatible.

Basta con añadir el [email protected] a vosotros aplicaciones atar Para hacer iOS 6 Haga usted aplicación ocupan el espacio adicional disponible en el iPhone 5.

Todos los controles nativos, como la barra de pestañas se comportará como era de esperar.

Si desea admitir iOS4.3 y 5. * en su aplicación, asegúrese de que Use Autolayout en la configuración de la punta (primera pestaña en el constructor de interfaz) esté desactivado.

continuación, asegúrese de configurar correctamente la vista autoresizingMask

1

if ([UIScreen mainScreen].escala == 2.f & & screenHeight == 568.0f) Las comparaciones exactas de los números de punto flotante no son una buena idea en ningún idioma debido a errores de redondeo en la forma en que se almacenan en la memoria. Por ejemplo, no puede garantizar que 568.0f no esté almacenado como 567.9999999 o 568.0000001. Es mucho más seguro usar un rango, o en este caso sería suficiente con screenHeight> 567.1f. Sospecho que incluso el iPhone no admite físicamente fracciones de píxeles.

+1

Pero afortunadamente en la práctica las cosas no son tan extrañas como las estás haciendo. Si utilizo el mismo compilador en la misma plataforma, estoy casi seguro de que 568.0 es el mismo en todas las representaciones, siempre que no se desprenda de otras operaciones. Piénselo, en algún lugar de la memoria, la altura del iPhone se declara y se devuelve a su aplicación. Ahí en memoria ponen 568.0, y luego lo comparan con 568.0. Usan XCode/GCC, usa la misma cosa, entonces ¿cómo podría el mismo compilador poner diferentes bits allí? – RelativeGames

0

Actualmente estoy detectando si el dispositivo actual es un 4" iPhone de esta manera y funciona muy bien. hth

- (BOOL)isiPhone5{ 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0); 
} 
1

EDITAR

cuidado, como de iOS8 UIScreen tener en cuenta la orientación (comprobar la altura puede devolver dos valores, la altura del retrato o la altura del paisaje, antes de que fuera solo la altura del retrato), pero los x juegos son mejores, puede consultarlo aquí: How to addapt iphone background?

FIN EDITAR

Basado en la respuesta de ben-clayton Hice una práctica categoría para administrar la imagen para iPhone 5. Gracias.

+ (UIImage *) imageForName:(NSString *)imageName 
{ 
    NSString *result = imageName; 

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; 
    BOOL isIphoneFive = ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f); 

    if (isIphoneFive) 
    { 
     NSString *imageNameWithoutExtension = [imageName stringByDeletingPathExtension]; 
     NSString *extension = [imageName pathExtension]; 

     result = [NSString stringWithFormat:@"%@-568h.%@",imageNameWithoutExtension, extension]; 
    } 

    return [UIImage imageNamed:result]; 
} 
Cuestiones relacionadas