Mac OS X: la Meilleure façon de le faire moment de l'exécution de l'affichage retina?
Donné une application Cocoa qui fonctionne sur Mac OS X 10.7 et versions ultérieures:
Quel est le meilleur moyen de vérifier, au moment de l'exécution, si votre application est en cours d'exécution sur un Mac avec au moins un écran retina attaché?
Si la vérification de ce genre de chose est vraiment aberrant, je suis entièrement d'accueillir un raisonnée explication de pourquoi (et je vais jusqu'-voter de telles réponses, si elles sont bonnes).
Mais je voudrais encore savoir :).
Il semble probable que vous pourriez juste faire une vérification spécifiquement pour le nouveau Mac Book Pro "Retina" matériel (le seul Mac qui dispose actuellement d'un écran retina), mais j'aurais vraiment préférer une approche plus générale/générique/l'avenir de façon à vérifier que cela.
Idéalement, j'aimerais savoir comment faire pour détecter l'affichage de la rétine, pas le Mac spécifique modèle qui actuellement se produit livré avec un écran retina.
OriginalL'auteur Todd Ditchendorf | 2012-06-16
Vous devez vous connecter pour publier un commentaire.
Si vous avez vraiment besoin de faire cela, jetez un oeil à
-[NSScreen backingScaleFactor]
. Mais, cela ne semble aberrant, au moins sans en savoir plus sur pourquoi vous voulez savoir.Alors qu'il n'existe actuellement qu'un Mac avec un écran Retina, il peut éventuellement être autonome affiche que le soutien de la Rétine (et peut être attaché/détaché à l'exécution) et vous pouvez le configurer de la intégré dans un écran Retina en 1x mode. Ainsi, la réponse à la question "est-il un affichage de la Rétine attaché" peut changer à tout moment.
Plutôt, vous voudrez peut-être savoir si votre contenu doit être établi à une échelle donnée par l'aide de la
-convert*ToBacking:
méthodes ou-[NSWindow backingScaleFactor]
. Pour une tonne plus de détails, regardez la WWDC 2012 session vidéo "Avancé trucs et Astuces pour la Haute Résolution sur OS X" (quand il est affiché, je l'espère dans les prochaines semaines).Ce n'est pas faire fausse route à faire. Web-sites absolument besoin de le faire afin de fournir le bon de ressources pour les iPads et iPhones en ce moment, donc pourquoi devrait-il être différent pour les applications? Bien sûr, c'est faire fausse route à faire votre propre vérification au lieu de en laissant l'OS le faire dans le simple asset swap de cas (c'est à dire, l' @2x cas). 🙂
Un navigateur web peut avoir besoin de télécharger 2x images, mais seulement si la fenêtre du navigateur est sur un 2x affichage... ce qui pourrait changer à tout moment, pour les raisons mentionnées ci-dessus.
Pas tous les UIKit/AppKit classes de soutenir @2x ressources échangeant de manière à vos utilisateurs peuvent s'attendre (NSImageView est un cas d'espèce). Ne soyez pas trop surveillé ici qu'il y a "la droite dirigés par des" raisons de briser toutes sortes de développement "tabous".
+1, mais merci de ne pas même penser que les personnes sur
-[NSScreen backingScaleFactor]
, je vois trop souvent[[NSScreen mainScreen] backingScaleFactor]
et c'est faux! J'ai écrit un post sur ce NSView,NSCell,CALayer Tirage de l'Affichage RetinaOriginalL'auteur tjw
J'ai juste couru dans un cas où j'avais besoin de détecter si un écran haute résolution, cela a fonctionné
for (NSScreen *screen in [NSScreen screens])
? Vous permet d'économiser beaucoup de temps de frappe (et est plus rapide à l'exécution).oui,celui-ci fonctionne! thumbs up! flotteur displayScale = 1.0; si ([[NSScreen écran principal] respondsToSelector:@selector(backingScaleFactor)]) {for (NSScreen *écran dans [NSScreen écrans]) {float s = [écran backingScaleFactor];si ( s > displayScale) displayScale = s;}}NSLog(@"displayScale=%f",displayScale);float x0 = displayScale * la maîtrise de soi.cadre.de l'origine.x;float y0 = displayScale * la maîtrise de soi.cadre.de l'origine.y;float w0 = displayScale * la maîtrise de soi.cadre.taille.largeur;float h0 = displayScale * la maîtrise de soi.cadre.taille.hauteur;NSLog(@"x=%f;y=%f;w=%f h=%f",x0,y0,w0,h0);
OriginalL'auteur nuclearnova
Bien sur iOS que vous utilisez le
UIScreen.échelle
de la propriété. Si elle renvoie2.0
, alors vous êtes sur un appareil doté d'un écran haute résolution. Sinon, vous êtes sur une faible résolution de l'appareil.Donc j'imagine que sur Mac OS, vous pouvez utiliser soit
-[NSScreen backingScaleFactor]
ou-[NSWindow backingScaleFactor]
.Veuillez oublier
-[NSScreen backingScaleFactor]
, la bonne façon de faire est d'adapter ton code en fonction de la fenêtre du facteur d'échelle. Le système est responsable de la détermination du facteur d'échelle est appropriée pour une fenêtre donnée.Parfois, vous n'avez pas besoin de cela pour le dessin. Dans mon cas, je vais prendre une capture d'écran de plusieurs écrans et ensuite, vous devez calculer la précision du pixel-position. -[NSScreen backingScaleFactor] est le chemin à parcourir.
Je suis d'accord! Mais certains cas rares, la plupart des applications uniquement besoin de se soucier de leurs fenêtres, pas d'écrans.
OriginalL'auteur Dave DeLong