225 votes

Détecter l'écran Retina

Le SDK d'iOS fournit-il un moyen facile de vérifier si l'appareil actuel a un écran haute résolution (rétine) ?

Le meilleur moyen que j'ai trouvé pour le faire maintenant est :

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
         // RETINA DISPLAY
    }

0 votes

Par curiosité, que faites-vous lorsque vous détectez l'affichage, à part montrer des versions plus grandes de vos œuvres d'art ?

4 votes

0 votes

@mbehan : J'ai un TTImageView (voir cadre Three20) et je veux donner une url haute résolution de l'image.

296voto

sickp Points 7522

Afin de détecter l'écran Retina de manière fiable sur tous les appareils iOS, vous devez vérifier si l'appareil fonctionne sous iOS4+ et si l'écran Retina est activé. [UIScreen mainScreen].scale est égal à 2.0. Vous NE POUVEZ PAS supposer qu'un appareil fonctionne sous iOS4+ si la propriété scale existe, car l'iPad 3.2 contient également cette propriété.

Sur un iPad fonctionnant sous iOS3.2, l'échelle renverra 1,0 en mode 1x et 2,0 en mode 2x - même si nous savons que cet appareil ne contient pas d'écran Retina. Apple a modifié ce comportement dans iOS4.2 pour l'iPad : il renvoie 1,0 en mode 1x et 2x. Vous pouvez le tester vous-même dans le simulateur.

Je teste pour le -displayLinkWithTarget:selector: sur l'écran principal qui existe dans iOS4.x mais pas dans iOS3.2, puis vérifiez l'échelle de l'écran :

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0)) {
  // Retina display
} else {
  // non-Retina display
}

0 votes

Vous dites que "Apple a modifié ce comportement dans iOS4.2 pour l'iPad", ce qui implique que dans iOS4.1, votre code ci-dessus renverrait "est Retina" pour un iPad exécutant une application iPhone en mode 2x. Ai-je tort ?

9 votes

Il n'y a jamais eu de 4.1 pour l'iPad. Seulement 3.2, puis 4.2.

11 votes

Cet appel est un peu coûteux, donc je l'initialiserais dans un BOOL au démarrage de l'application et je l'utiliserais dans l'application.

81voto

Mick Byrne Points 4744

La réponse de @sickp est correcte. Pour vous faciliter la tâche, ajoutez cette ligne dans votre fichier Shared.pch :

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))

Ensuite, dans n'importe quel fichier, vous pouvez simplement faire :

if(IS_RETINA)
{
   // etc..
}

0 votes

Cela ne fonctionne pas sur le simulateur. Est-ce à cause du respondsToSelector ? Le simulateur ne répond pas au sélecteur ?

2 votes

Super ! Cependant, si vous voulez prendre en compte l'iPhone 6 Plus, vous devriez vérifier l'échelle >= 2.0.

19voto

Mani Points 1620
+(BOOL)iPhoneRetina{
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}

23 votes

Pourquoi le ?1:0 ? Ne s'agit-il pas simplement de réitérer ce qui a déjà été calculé dans la partie booléenne de l'expression ?

6voto

Pedro Points 418

Cet extrait...

    int d = 0; // standard display
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) {
    d = 1; // is retina display
}

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    d += 2;
}

Retournera... 0 pour un iPhone/iPod touch de résolution standard, 1 pour iPhone retina, 2 pour un iPad de résolution standard, 3 pour iPad retina.

6voto

Jorge Perez Points 656

SSToolkit a une méthode qui fait cela :

http://sstoolk.it/documentation/Categories/UIScreen(SSToolkitAdditions).html

Il est utilisé de la manière suivante :

[[UIScreen mainScreen] isRetinaDisplay];

0 votes

Cette utilisation particulière a été remplacée par SAMCategories dans SSToolKit : [[UIScreen mainScreen] sam_isRetina]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X