¿Cómo manejar la escala de imagen en todas las resoluciones de iPhone disponibles?

99

¿Qué tamaños sería mejor usar para las imágenes: background.png, [email protected] y [email protected] si queremos usar esta imagen, por ejemplo, para cubrir el ancho completo y la mitad de la altura de la pantalla en todas las resoluciones para aplicación de retrato de iPhone?

Esto es lo que tenemos ahora:

Device          Points    Pixels     Scale  Physical Pixels   PPI   Ratio   Size
iPhone XS Max   896x414   2688x1242  3x     2688x1242         458   19.5:9  6.5"
iPhone XR       896x414   1792x828   2x     1792x828          326   19.5:9  6.1"
iPhone X        812x375   2436x1125  3x     2436x1125         458   19.5:9  5.8"
iPhone 6 Plus   736x414   2208x1242  3x     1920x1080         401   16:9    5.5"
iPhone 6        667x375   1334x750   2x     1334x750          326   16:9    4.7"
iPhone 5        568x320   1136x640   2x     1136x640          326   16:9    4.0"
iPhone 4        480x320   960x640    2x     960x640           326   3:2     3.5"
iPhone 3GS      480x320   480x320    1x     480x320           163   3:2     3.5"

resoluciones de iPhone

Algunas personas dicen que para la imagen de borde a borde (como un banner en la parte inferior desde el borde izquierdo al derecho de la pantalla) para iPhone 6 Plus, prepararían [email protected] con ancho 1242 y para iPhone 6 [email protected] con ancho 750 para que coincida con el tamaño de la pantalla del iPhone 6, sin embargo, no creo que sea una buena idea porque 1242/3 = 414 y 750/2 = 375, por lo que nombrarlos como @ 2x y @ 3x no tiene sentido. Y luego, ¿qué ancho debería tener back.png - 375 o 414?

Los nombres de los gráficos utilizan los sufijos @ 2x y @ 3x, por lo que si, por ejemplo, [email protected] tiene una resolución de 30x30, entonces, lógicamente, [email protected] debería tener una resolución de 20x20 y image.png debería ser de 10x10. Esto significa que si queremos tener una imagen nítida de ancho completo para cada pantalla, entonces probablemente deberíamos crear [email protected] con ancho 414 3 = 1242px, [email protected] con ancho 414 2 = 828px y back.png con ancho 414px . Sin embargo, esto significa que en todos los iPhone, excepto en el iPhone 6 Plus, deberá configurar sus imágenes de interfaz de usuario para usar, por ejemplo, el modo de contenido de ajuste de aspecto y se reducirán, por lo que nuevamente esta no es una solución perfecta y probablemente ralentizaría la aplicación si utilizamos mucho escalado en dispositivos más antiguos.

Entonces, ¿cuál crees que sería la mejor solución para resolver este problema?

Leszek Szary
fuente
1
Enlace desmitificado de pantallas de iPhone 6: bit.ly/1qHEBKk Enlace a la guía definitiva para resoluciones de iPhone: bit.ly/1paVXLd
King-Wizard
iPhone 6 Plus 414 x 736 puntos 1242 x 2208 píxeles Escala 3x 1080 x 1920 píxeles físicos 401 ppi físicos 5.5 "iPhone 6 375 x 667 puntos 750 x 1334 píxeles Escala 2x 750 x 1334 píxeles físicos 326 ppi físicos 4.7" iPhone 5320 x 568 puntos 640 x 1136 píxeles escala 2x 640 x 1136 píxeles físicos 326 ppi físicos 4.0 "
King-Wizard
iPhone 4320 x 480 puntos 640 x 960 píxeles escala 2x 640 x 960 píxeles físicos 326 ppi físicos 3,5 "iPhone 3GS 320 x 480 puntos 320 x 480 píxeles escala 1x 320 x 480 píxeles físicos 163 ppi físicos 3,5"
King-Wizard

Respuestas:

49

No es necesario que tenga cada imagen en todas las escalas si no se utilizará. Haga solo los tamaños que necesite y nómbrelos de acuerdo con su ancho. Para imágenes verticales de ancho de dispositivo completo, necesita 320px de ancho a 1x y 2x, 375px de ancho a 2x y 414px de ancho a 3x.

Los dispositivos de 4 "usaban el sufijo" -568h "para nombrar sus imágenes de lanzamiento, por lo que recomendaría un esquema de nombres similar:

  • ImageName-320w (@ 1x y @ 2x)
  • ImageName-375w (@ 2x)
  • ImageName-414w (@ 3x)

Luego, averigüe qué imagen necesita en tiempo de ejecución:

NSNumber *screenWidth = @([UIScreen mainScreen].bounds.size.width);
NSString *imageName = [NSString stringWithFormat:@"name-%@w", screenWidth];
UIImage *image = [UIImage imageNamed:imageName];

Esto podría romperse si se agregan otros anchos en el futuro, pero hasta ahora Apple siempre ha requerido reconstruir la aplicación para admitir nuevas pantallas, así que supongo que es algo seguro asumir que continuarán haciéndolo.

Filip Radelic
fuente
Bueno, esa es una de las razones por las que Apple no introdujo la versión de 32 GB de los nuevos iphones. 16 GB como dispositivos de prueba y 64 para uso. El tamaño de las aplicaciones aumentará drásticamente debido a los gráficos.
Ilker Baltaci
1
@IlkerBaltaci Lo entendería si solo dejaran que los desarrolladores compren la versión de 16 GB, pero de esta manera habrá muchas personas que ni siquiera podrán actualizar su sistema operativo debido a la falta de espacio en el disco.
Filip Radelic
eso es cierto incluso con 32 GB tuve que esperar una semana para limpiar y hacer 5 GB de espacio para IOS 8.
Ilker Baltaci
2
¿Cómo utilizarlos en IB?
Khawar
@FilipRadelic ¿qué pasa con el iPhone5? el ancho es 640 pero la altura es diferente a la que se usa para los iPhones 4
MeV
41

Yo personalmente estaré haciendo:

ImageName @ 2x iPhone 4 / 4s
ImageName-568h @ 2x iPhone 5 / 5s
ImageName-667h @ 2x iPhone 6
ImageName-736h @ 3x iPhone 6Plus

La lógica detrás de esto es que muestra una diferencia entre todos los dispositivos, mientras que el ancho comparte el mismo valor en el iPhone 5s y el iPhone 4s.

Editar:

Esta es solo la convención de nomenclatura que estoy usando para los recursos que dependen del dispositivo, como una imagen de fondo que toma toda la pantalla, la mayoría de las veces todo lo que desea es:

ImageName @ 2x iPhone 4 / 4s / 5 / 5s / 6
ImageName @ 3x iPhone 6Plus / Modo Zoom

el gusano del terror
fuente
1
¿Qué pasa con el "modo Zoom" en el iPhone 6 plus? ¿No deberíamos necesitar proporcionar un ImageName-667h @ 3x también?
François Verry
@thewormsterror Creo que la última convención de nomenclatura de imágenes está funcionando
Hades
@thewormsterror gran respuesta, también puede agregar cómo se deben nombrar las imágenes de ipad.
Lukas
Si la imagen que proviene de una api es 1024 x 768, ¿significa que el tamaño máximo que puedo usar es 256 @ 3x?
Mirko
8

Para la discusión de @ 2x y @ 3x, realmente no tiene que preocuparse por eso. Tenga cuidado con el tamaño en puntos de la pantalla y asegúrese de que haya recursos @ 2x con el doble del tamaño en puntos y recursos @ 3x con el triple del tamaño en píxeles. El dispositivo seleccionará automáticamente el correcto. Pero al leer tu publicación supongo que ya lo sabes.

Para imágenes de borde a borde, desafortunadamente debe hacerlo para todas las resoluciones de pantalla. Entonces, para un iPhone vertical, serían 320 puntos, 375 puntos y 414 puntos, donde los 414 puntos tendrían que ser @ 3x. Una mejor solución puede ser hacer que sus imágenes sean escalables configurando la división en el generador de interfaces (si usa catálogos de imágenes, claro está). Pero, dependiendo de la imagen, esto puede ser una opción o no, dependiendo de si la imagen tiene una parte repetible o extensible. Las imágenes escalables configuradas como esta tienen muy poco impacto en el rendimiento.

Emiel
fuente
1
Necesito ajustar el ancho de la pantalla con una imagen dentro de una uicollectionviewcell (obviamente dentro de una uicollectionview que se ajusta a toda la pantalla). Para el iphone 6 plus resuelvo poner para el 3x a (414x3 = 1242 px), el 2x ¿qué tamaño tengo que usar? Tiene que adaptarse al iphone4s / 5 / 5s y también a la pantalla 6 ...
jerrygdm
1
Tengo un icono de tamaño 222px x 260px, que parece encajar perfectamente en la pantalla del iPhone5 / 5s. Ahora, mientras hace que la aplicación sea compatible con la pantalla del iPhone6 ​​y 6plus 1) ¿cuál debería ser el tamaño de ese icono? según la regla de tres veces, ¿debería ser de 333px x 390px? 2) ¿Debería aplicar algún cambio de tamaño automático a la imagen en xib?
Respuesta
@ jerrygdm, tengo casi el mismo escenario que el tuyo. ¿Qué hiciste al final del día? ¿Puedes compartir eso conmigo por favor?
Tulon
@ Ans, ¿ha utilizado el icono 3x para iphone6 ​​y iphone6Plus?
JiteshW
@Jitesh Estoy haciendo la misma pregunta ... ¿en qué tamaño debería hacer el icono x3x? Quiero agregar, pero cuál debería ser el tamaño ... esta fue mi pregunta ..
Respuesta
2

@ 2 y @ 3 no es la escala de imagen real, sino que solo representan la cantidad de píxel real que representa un píxel virtual en la pantalla, una especie de hdpi / xhdpi / xxhdpi / blabla del universo Android. solo muestra al sistema qué imagen debe usarse para la pantalla de algún dispositivo.

por lo tanto, si necesita usar una imagen de pantalla completa, prepárela en función del tamaño de pantalla real.

Denis Kozhukhov
fuente
2

Dependiendo de los gráficos, en algunos casos, podría funcionar bien cuando usamos una sola imagen, por ejemplo, un banner con un tamaño de 414 puntos de ancho x 100 puntos de alto (el ancho más grande posible y una altura fija) y lo colocamos en un UIImageView que está anclado a el borde izquierdo y derecho de la pantalla, tiene una altura fija de 100 y establece el modo de relleno de aspecto para ese UIImageView. Luego, en dispositivos más pequeños, se cortará el lado izquierdo y derecho de la imagen y solo veremos la parte central de la imagen.

Leszek Szary
fuente
2

He creado una categoría para esto:

+ (UIImage *)sizedImageWithName:(NSString *)name {
    UIImage *image;
    if (IS_IPHONE_5) {
        image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-568h",name]];
        if (!image) {
            image = [UIImage imageNamed:name];
        }
    }
    else if (IS_IPHONE_6) {
        image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-750w",name]];
    }
    else {
        image = [UIImage imageNamed:name];
    }
    return image;
}

puede tomar el código completo aquí: https://gist.github.com/YGeorge/e0a7fbb479f572b64ba5

Jorge
fuente
0

Creo que la mejor solución para las imágenes de borde a borde o de pantalla completa es preocuparse por el tamaño real de la pantalla en píxeles (no en puntos), y debe verificar en tiempo de ejecución el modelo del dispositivo y elegir la imagen adecuada, es decir:

image-iphone4-4s.png (640x960/2) for 1/2 screen height, image-iphone5-5c-5s.png (640x1136/2) for 1/2 screen height, image-iphone6-6s.png (750x1334/2) for 1/2 screen height, image-iphone6plus-6splus.png (1242x2208/2) for 1/2 screen height,

no hay necesidad de @? x en esta situación del autor de la pregunta.

ناصر عبده عبده محمد
fuente
0

Creo que deberíamos usar diferentes tamaños de imágenes de fondo para diferentes dispositivos. Simplemente use imágenes a escala @ 3x para el fondo.

Puede detectar el dispositivo con las siguientes líneas.

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0) 
usuario2024885
fuente