web-dev-qa-db-fra.com

Quelle est la différence entre -nativeScale et -scale sur UIScreen dans iOS8 +?

Dans les exemples de journaux publiés dans cette question , les résultats sont identiques. Est-ce que quelqu'un sait s'il est censé y avoir une différence logique entre les deux?

Même description d'Apple prête à confusion. Voici la description de scale:

Le facteur d'échelle naturel associé à l'écran ... Cette valeur reflète le facteur d'échelle nécessaire pour convertir de l'espace de coordonnées logique par défaut en l'espace de coordonnées de l'appareil de cet écran ...

Voici leur description de nativeScale :

Le facteur d'échelle natif pour l'écran physique

Quelle est la différence entre naturel et natif ?

35
Dev Kanchen

Scale et nativeScale vous indiquent à combien de pixels correspond un point. Mais gardez à l'esprit que les points sont rendus dans un tampon intermédiaire de pixels , qui est ensuite redimensionné pour correspondre à la résolution d'écran. Ainsi, lorsque nous demandons, "1 pt correspond à combien de pixels?" cela peut signifier des pixels intermédiaires (échelle) ou les pixels finaux (nativeScale).

Sur un iPhone Plus, l'échelle est de 3, mais nativeScale est de 2,6. En effet, le contenu est rendu à 3x (1 point = 3 pixels) mais le bitmap résultant est réduit, ce qui donne 1 point = 2,6 pixels.

Ainsi, scale traite du bitmap intermédiaire et nativeScale du bitmap final.


Ceci est sans zoom d'affichage. Si vous activez le zoom d'affichage, l'échelle reste la même, à 3, car le tampon intermédiaire est toujours rendu à 1 point = 3 pixels. Mais l'échelle native devient 2,8.

Donc, si vous voulez vérifier l'écran physique, utilisez l'échelle. Par exemple, si vous avez une application qui ne fonctionne que sur l'iPhone Plus, vous pouvez faire:

if scale != 3 {
  print("Not supported")
}

Ne pas:

if nativeScale != 2.6 {
  print("Not supported")
}

Le deuxième fragment de code ne parvient pas à faire ce qui était attendu lorsque l'utilisateur active le zoom d'affichage.

25
Vaddadi Kartick

Les propriétés nativeBounds et nativeScale sont principalement destinées à être utilisées avec OpenGL et représentent la taille réelle des pixels et le facteur d'échelle de points à pixels que vous utiliseriez pour tracer avec précision la résolution de l'écran, vous permettant d'éviter le coût de rendu supplémentaire du dessin à la taille virtuelle 1242 × 2208. Par exemple, avec un CAEAGLLayer, vous feriez ceci:

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;

… Et n'a alors qu'à restituer son contenu à la taille de nativeBounds, c'est-à-dire 1080 × 1920.

Les exemples de journaux dans cette question proviennent du simulateur, qui, comme toujours, n'est pas garanti de se comporter de manière identique à un périphérique réel.

24
Noah Witherspoon