Retina-Display erkennen

Bietet das iOS SDK eine einfache Möglichkeit zu überprüfen, ob das aktuelle Gerät über eine hochauflösende Anzeige (Retina) verfügt?

Der beste Weg, den ich jetzt gefunden habe, ist:

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

Solutions Collecting From Web of "Retina-Display erkennen"

Um das Retina-Display auf allen iOS-Geräten zuverlässig zu erkennen, müssen Sie überprüfen, ob auf dem Gerät iOS4 + ausgeführt wird und ob die Eigenschaft [UIScreen mainScreen].scale gleich 2.0 ist. Sie können nicht davon ausgehen, dass ein Gerät iOS4 + ausführt, wenn die Eigenschaft scale vorhanden ist, da das iPad 3.2 diese Eigenschaft ebenfalls enthält.

Auf einem iPad mit iOS3.2 gibt die Skalierung 1.0 im 1x-Modus und 2.0 im 2x-Modus zurück – obwohl wir wissen, dass das Gerät kein Retina-Display enthält. Apple hat dieses Verhalten in iOS4.2 für das iPad geändert: es gibt 1,0 sowohl im 1x- als auch im 2x-Modus zurück. Sie können dies selbst im Simulator testen.

Ich -displayLinkWithTarget:selector: für die -displayLinkWithTarget:selector: -Methode auf dem Hauptbildschirm, der in iOS4.x, aber nicht iOS3.2 existiert, und überprüfe dann die Bildschirmgröße:

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

@sickps Antwort ist korrekt. Um die Dinge einfacher zu machen, fügen Sie diese Zeile in Ihre Shared.pch-Datei ein:

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

Dann in jeder Datei können Sie einfach tun:

 if(IS_RETINA) { // etc.. } 
 +(BOOL)iPhoneRetina{ return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; } 

Dieser Ausschnitt …

  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; } 

Wird zurückkehren … 0 für Standardauflösung iPhone / iPod touch, 1 für Retina iPhone, 2 für Standardauflösung iPad, 3 für Retina iPad.

SSToolkit hat eine Methode, die das tut:

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

Es wird folgendermaßen verwendet:

 [[UIScreen mainScreen] isRetinaDisplay]; 

Es ist immer ein bisschen schwierig, Gleitkommawerte für Gleichheit zu vergleichen. Ich ziehe es vor, beides zu tun

 [UIScreen mainScreen].scale > 1.0; 

oder

 [UIScreen mainScreen].scale < 2.0; 

Hier ist eine praktische schnelle Erweiterung:

 extension UIScreen { public func isRetina() -> Bool { return screenScale() >= 2.0 } public func isRetinaHD() -> Bool { return screenScale() >= 3.0 } private func screenScale() -> CGFloat? { if UIScreen.mainScreen().respondsToSelector(Selector("scale")) { return UIScreen.mainScreen().scale } return nil } } 

Verwendung:

 if UIScreen.mainScreen().isRetina() { // your code } 

Dies ist ein Riff auf Matt MC’s Antwort oben. Nur eine Kategorie auf UIScreen .

 #import "UIScreen+Util.h" @implementation UIScreen (Util) + (BOOL) isRetinaDisplay { static BOOL retina = NO; static BOOL alreadyChecked = NO; if (!alreadyChecked) { UIScreen *mainScreen = self.mainScreen; if (mainScreen) { retina = mainScreen.scale > 1.0; alreadyChecked = YES; } } return retina; } @end 

Swift Version der obigen Antworten, mit> = 2.0 Skala, so dass es iPhone 6+ und andere zukünftige Geräte mit höherer als Retina-Skala umfasst:

  if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 { // code executed only on Retina device } 

Nur um die Antwort von @sickp und den folgenden Kommentar von @ n13 zu kombinieren, habe ich daraus eine UIScreen-Kategorie gemacht, die gut zu funktionieren scheint. Die Überprüfung wird beim ersten Anruf durchgeführt und dann für spätere Anrufe gespeichert.

 @interface UIScreen (RetinaCheck) + (BOOL)retinaScreen; @end static BOOL isRetinaScreen = NO; static BOOL didRetinaCheck = NO; @implementation UIScreen (RetinaCheck) + (BOOL)retinaScreen { if (!didRetinaCheck) { isRetinaScreen = ([[self mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([self mainScreen].scale == 2.0)); didRetinaCheck = YES; } return isRetinaScreen; } @end 

Könnte für jemanden nützlich sein.

 // .h UIKIT_EXTERN bool isRetinaDisplay(); // .m bool isRetinaDisplay() { static bool flag; #ifdef __BLOCKS__ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { flag = [[UIScreen mainScreen] scale] > 1.0; } else { flag = false; } }); #else static bool onceToken; if(onceToken == false) { onceToken = true; if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { flag = [[UIScreen mainScreen] scale] > 1.0; } else { flag = false; } } #endif return flag; } 

Versuche dies

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

Modifizierte Version von Primulaveris zur Vereinfachung der häufigsten Anwendungsfälle. Ich bin auf swift 2.2 aber es sollte nicht wichtig sein.

 extension UIScreen { static var isRetina: Bool { return screenScale >= 2.0 } static var isRetinaHD: Bool { return screenScale >= 3.0 } static var screenScale:CGFloat { return UIScreen.mainScreen().scale } } 

Dann benutze sie einfach so

 print(UIScreen.isRetina) print(UIScreen.isRetinaHD) print(UIScreen.screenScale) 

Das hat für mich funktioniert

 if((UIScreen .mainScreen().scale) < 2.0) { NSLog("no retina"); } else { NSLog("retina"); }