¿Cuál es la diferencia entre-nativeScale y-scale en UIScreen en iOS8+?
(2)
En los registros de muestra publicados en esta pregunta , los resultados son idénticos. ¿Alguien sabe si hay una diferencia lógica entre los dos?
Incluso la descripción de Apple es confusa. Aquí está la descripción de la scale
:
El factor de escala natural asociado con la pantalla ... Este valor refleja el factor de escala necesario para convertir el espacio de coordenadas lógicas predeterminado en el espacio de coordenadas del dispositivo de esta pantalla ...
Aquí está su descripción de nativeScale
:
El factor de escala nativo para la pantalla física.
¿Cuál es la diferencia entre lo natural y lo nativo ?
Las propiedades de nativeBounds
y nativeScale
están pensadas principalmente para su uso con OpenGL y representan el tamaño real de píxeles y el factor de escala de puntos a píxeles que usaría para dibujar con precisión la resolución de la pantalla, lo que le permite evitar el costo de representación adicional del dibujo en el tamaño virtual 1242 × 2208. Por ejemplo, con un CAEAGLLayer, harías esto:
theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;
... y luego solo tiene que representar su contenido al tamaño de los nativeBounds
, es decir, 1080 × 1920.
Los registros de muestra en esa pregunta provienen del simulador, que como siempre no se garantiza que se comporte de manera idéntica a un dispositivo real.
Tanto scale como nativeScale te dicen a cuántos píxeles corresponde un punto. Pero tenga en cuenta que los puntos se representan en un búfer intermedio de píxeles , que luego se redimensiona para que coincida con la resolución de la pantalla. Entonces, cuando preguntamos, "1 punto corresponde a cuántos píxeles?" puede significar píxeles intermedios (escala) o los píxeles finales (nativeScale).
En un iPhone Plus, la escala es 3, pero NativeScale es 2.6. Esto se debe a que el contenido se representa en 3x (1 punto = 3 píxeles) pero luego el mapa de bits resultante se reduce, resultando en 1 punto = 2.6 píxeles.
Así que la escala trata con el mapa de bits intermedio, y nativeScale trata con el mapa de bits final.
Esto es sin pantalla de zoom. Si habilita el zoom de visualización, la escala permanece igual, en 3, ya que el búfer intermedio aún se procesa en 1 punto = 3 píxeles. Pero la escala nativa se convierte en 2.8.
Por lo tanto, si desea comprobar la pantalla física, utilice la escala. Por ejemplo, si tiene una aplicación que solo se ejecuta en el iPhone Plus, podría hacer:
if scale != 3 {
print("Not supported")
}
No:
if nativeScale != 2.6 {
print("Not supported")
}
El segundo fragmento de código no hace lo que se esperaba cuando el usuario habilita el zoom de pantalla.