Confusión en la resolución del iPhone 6 Plus: ¿Xcode o el sitio web de Apple? Para desarrollo

El sitio web de Apple afirma que la resolución es 1080p: 1920 x 1080

Sin embargo, la pantalla de lanzamiento requerida por Xcode (8.0 GM lanzada hoy) es de 2208 x 1242.

¿Quién tiene la razón?

Xcode

El iPhone 6+ se procesa internamente utilizando activos @ 3x a una resolución virtual de 2208 × 1242 (con 736×414 puntos), luego toma muestras para su visualización. Lo mismo que usar una resolución escalada en una MacBook Retina: les permite pulsar un múltiplo entero para activos de píxeles mientras que, por ejemplo, el texto de 12 puntos tiene el mismo tamaño en la pantalla.

Entonces, sí, las pantallas de lanzamiento deben ser de ese tamaño.

Las matemáticas:

El 6, el 5, el 5, el 4 y el 4 son todos 326 píxeles por pulgada, y usan activos @ 2x para adherirse a los aproximadamente 160 puntos por pulgada de todos los dispositivos anteriores.

El 6+ tiene 401 píxeles por pulgada. Entonces, hipotéticamente, necesitaría unos 2.46x activos. En su lugar, Apple usa los activos de @ 3x y escala la producción completa hasta aproximadamente el 84% de su tamaño natural.

En la práctica, Apple ha decidido ir con más del 87%, convirtiendo el 1080 en 1242. Sin duda fue para encontrar algo lo más parecido posible al 84% que todavía producía tamaños integrales en ambas direcciones – 1242/1080 = 2208/1920 exactamente , mientras que si convirtieras el 1080 en, digamos, 1286, de alguna manera tendrías que renderizar 2286.22 píxeles verticalmente para escalar bien.

La respuesta es que las aplicaciones antiguas se ejecutan en modo Zoom 2208 x 1242. Pero cuando se crea una aplicación para los teléfonos nuevos, las resoluciones disponibles son: Super Retina HD 5.8 (iPhone X) 1125 x 2436 (458ppi) , Retina HD 5.5 ( iPhone 6, 7, 8 Plus ) 1242 x 2208 y Retina HD 4.7 ( iPhone 6 ) 750 x 1334 . Esto está causando la confusión mencionada en la pregunta. Para crear aplicaciones que utilicen el tamaño de pantalla completa de los nuevos teléfonos, agregue LaunchImages en los tamaños: 1125 x 2436, 1242 x 2208, 2208 x 1242 y 750 x 1334.

Tamaño para iPhone X con escalado @ 3x (nombre de Apple: Super Retina HD ), espacio de coordenadas: 375 x 812 puntos y 1125 x 2436 píxeles, 458 ppi, el tamaño físico del dispositivo es 2.79 x 5.65 in o 70.9 x 143.6 mm .

Tamaño para iPhone 6, 6S, 7 y 8 con escalado @ 3x (nombre de Apple: Retina HD 5.5 ), espacio de coordenadas: 414 x 736 puntos y 1242 x 2208 píxeles, 401 ppi, tamaño físico de pantalla es 2.7 x 4.8 in o 68 x 122 mm . Cuando se ejecuta en modo Zoom, es decir, sin los nuevos LaunchImages o seleccionado en Configuración en iPhone 6 Plus, la escala nativa es 2.88 y la pantalla tiene 320 x 568 puntos, que es el tamaño original del iPhone 5:

 Screen bounds: {{0, 0}, {414, 736}}, Screen resolution: >, scale: 3.000000, nativeScale: 3.000000 

Tamaño para iPhone 6 y iPhone 6S con escalamiento @ 2x (nombre de Apple: Retina HD 4.7 ), espacio de coordenadas: 375 x 667 puntos y 750 x 1334 píxeles, 326 ppp, el tamaño físico de la pantalla es de 2.3 x 4.1 in o 58 x 104 mm . Cuando se ejecuta en modo Zoomed, es decir, sin los nuevos LaunchImages, la pantalla tiene 320 x 568 puntos, que es el tamaño nativo del iPhone 5:

 Screen bounds: {{0, 0}, {375, 667}}, Screen resolution: >, scale: 2.000000, nativeScale: 2.000000 

Y el iPhone 5 para la comparación es 640 x 1136, iPhone 4 640 x 960.


Aquí está el código que usé para verificar esto (tenga en cuenta que nativeScale solo se ejecuta en iOS 8):

 UIScreen *mainScreen = [UIScreen mainScreen]; NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f", NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale); 

Nota: Cargue LaunchImages, de lo contrario, la aplicación se ejecutará en modo Zoom y no mostrará la escala correcta o los tamaños de pantalla. En modo nativeScale la nativeScale y la scale nativeScale no serán las mismas. En un dispositivo real, la escala puede ser 2.608 en el iPhone 6 Plus, incluso cuando no se está ejecutando en modo Zoom, pero mostrará una escala de 3.0 cuando se ejecute en el simulador.

Comparando iPhone 6 y 6 Plus

La resolución real / física del iPhone 6 Plus es de 1920×1080, pero en Xcode usted hace su interfaz para una resolución de 2208×1242 (736×414 puntos) y en el dispositivo se reduce automáticamente a 1920×1080 píxeles.

Referencia rápida de resoluciones de iPhone:

 Device Points Pixels Scale Physical Pixels Physical PPI Size iPhone X 812x375 2436x1125 3x 2436x1125 458 5.8" iPhone 6 Plus 736x414 2208x1242 3x 1920x1080 401 5.5" iPhone 6 667x375 1334x750 2x 1334x750 326 4.7" iPhone 5 568x320 1136x640 2x 1136x640 326 4.0" iPhone 4 480x320 960x640 2x 960x640 326 3.5" iPhone 3GS 480x320 480x320 1x 480x320 163 3.5" 

resoluciones de iPhone

Probablemente deberías dejar de usar las imágenes de inicio en iOS 8 y usar un guión gráfico o nib / xib.

  • En Xcode 6 , abra el menú File y elija NewFile...iOSUser InterfaceLaunch Screen inicio.

  • A continuación, abra la configuración de su proyecto haciendo clic en él.

  • En la pestaña General , en la sección llamada App Icons and Launch Images , configure el Launch Screen File UILaunchStoryboardName en los archivos que acaba de crear (esto configurará UILaunchStoryboardName en info.plist ).

Tenga en cuenta que, por el momento, el simulador solo mostrará una pantalla negra, por lo que debe probar en un dispositivo real .

Agregar un archivo xib de pantalla de inicio a su proyecto:

Agregar un nuevo archivo xib de pantalla de inicio

Configuración de su proyecto para usar el archivo xib de la pantalla de inicio en lugar del catálogo de activos:

Configurar el proyecto para usar Launch Screen xob

En el dispositivo físico, los límites de la pantalla principal de iPhone 6 Plus son 2208×1242 y nativeBounds es 1920×1080 . Hay escala de hardware involucrada para cambiar el tamaño de la pantalla física.

En el simulador, los límites de la pantalla principal del iPhone 6 Plus y los nativos son ambos 2208×1242.

En otras palabras … Los videos, OpenGL y otras cosas basadas en CALayers que se ocupan de píxeles se ocuparán de la memoria de fotogtwigs real de 1920×1080 en el dispositivo (o 2208×1242 en la tarjeta SIM). Las cosas relacionadas con los puntos en UIKit se ocuparán de los límites de 2208×1242 (x3) y se ampliarán según corresponda en el dispositivo.

El simulador no tiene acceso al mismo hardware que está escalando en el dispositivo y no hay mucho beneficio de simularlo en el software, ya que produciría resultados diferentes al hardware. Por lo tanto, tiene sentido establecer los elementos nativeBounds de la pantalla principal de un dispositivo simulado en los límites de la pantalla principal del dispositivo físico.

iOS 8 agregó API a UIScreen ( nativeScale y nativeBounds ) para permitir que un desarrollador determine la resolución de CADisplay correspondiente a UIScreen .

Echa un vistazo a esta infografía: http://www.paintcodeapp.com/news/iphone-6-screens-demystified

Explica las diferencias entre los viejos iPhones, iPhone 6 y iPhone 6 Plus. Puede ver una comparación de tamaños de pantalla en puntos, píxeles renderizados y píxeles físicos. También encontrarás respuesta a tu pregunta allí:

iPhone 6 Plus: con pantalla Retina HD. El factor de escala es 3 y luego la imagen se reduce de 22042 × 1242 píxeles a 1920 × 1080 píxeles.

La relación de reducción a escala es 1920/2208 = 1080/1242 = 20 / 23. Esto significa que cada 23 píxeles del renderizado original debe mapearse a 20 píxeles físicos. En otras palabras, la imagen se reduce a aproximadamente el 87% de su tamaño original.

Actualizar:

Hay una versión actualizada de la infografía mencionada anteriormente. Contiene información más detallada sobre las diferencias de resolución de pantalla y cubre todos los modelos de iPhone hasta el momento, incluidos los dispositivos de 4 pulgadas.

http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

Para aquellos que como yo nos preguntamos cómo se tratan las aplicaciones heredadas, hice algunas pruebas y cálculos sobre el tema.

Gracias a la sugerencia de @ hannes-sverrisson, comencé asumiendo que una aplicación heredada se trata con una vista de 320×568 en iPhone 6 y iPhone 6 plus.

La prueba se realizó con un fondo negro simple bg@2x.png con un borde blanco. El fondo tiene un tamaño de 640×1136 píxeles, y es negro con un borde interior blanco de 1 píxel.

A continuación se muestran las capturas de pantalla proporcionadas por el simulador:

En la captura de pantalla del iPhone 6, podemos ver un margen de 1 píxel en la parte superior e inferior del borde blanco, y un margen de 2 píxeles en la captura de pantalla del iPhone 6 plus. Esto nos da un espacio usado de 1242×2204 en iPhone 6 plus, en lugar de 1242×2208, y 750×1332 en el iPhone 6, en lugar de 750×1334.

Podemos suponer que esos píxeles muertos están destinados a respetar la relación de aspecto del iPhone 5:

 iPhone 5 640 / 1136 = 0.5634 iPhone 6 (used) 750 / 1332 = 0.5631 iPhone 6 (real) 750 / 1334 = 0.5622 iPhone 6 plus (used) 1242 / 2204 = 0.5635 iPhone 6 plus (real) 1242 / 2208 = 0.5625 

En segundo lugar, es importante saber que los recursos de @ 2x se ampliarán no solo en iPhone 6 plus (que espera @ 3x activos), sino también en el iPhone 6. Esto es probablemente porque no escalar los recursos hubiera llevado a diseños inesperados, debido a la ampliación de la vista.

Sin embargo, esa escala no es equivalente en ancho y alto. Lo intenté con un recurso de 264×264 @ 2x. Dados los resultados, debo suponer que la escala es directamente proporcional a la relación píxeles / puntos.

 Device Width scale Computed width Screenshot width iPhone 5 640 / 640 = 1.0 264 px iPhone 6 750 / 640 = 1.171875 309.375 309 px iPhone 6 plus 1242 / 640 = 1.940625 512.325 512 px Device Height scale Computed height Screenshot height iPhone 5 1136 / 1136 = 1.0 264 px iPhone 6 1332 / 1136 = 1.172535 309.549 310 px iPhone 6 plus 2204 / 1136 = 1.940141 512.197 512 px 

Es importante tener en cuenta que la escala del iPhone 6 no es la misma en ancho y alto (309×310). Esto tiende a confirmar la teoría anterior de que la escala no es proporcional en ancho y alto, sino que usa la relación píxeles / puntos.

Espero que esto ayude.

Incluso si en general no me gusta el tono del blog Daring Fireball de John Gruber, vale la pena leer su conjetura de pantalla de iPhone más grande .

Adivinó pero acertó tanto la resolución en puntos como en píxeles para ambos modelos, excepto que él (yo) no esperaba que Apple construyera una pantalla física de resolución más pequeña y escalara (los detalles están en la respuesta de @Tommy).

La esencia de todo es que uno debe dejar de pensar en términos de píxeles y comenzar a pensar en términos de puntos (este ha sido el caso durante bastante tiempo, no es una invención reciente) y el tamaño físico resultante de los elementos de la interfaz de usuario. En resumen, los dos nuevos modelos de iPhone mejoran en este sentido, ya que la mayoría de los elementos físicos siguen siendo del mismo tamaño, puede simplemente colocar más de ellos en la pantalla (para cada pantalla más grande puede caber más).

Estoy un poco decepcionado de que no hayan conservado el mapeo de la resolución interna en una resolución de pantalla real de 1: 1 para el modelo más grande.