Обнаружение Retina Display

Предоставляет ли IOS SDK простой способ проверить, имеет ли currentDevice дисплей с высоким разрешением (сетчатка)?

Лучший способ, которым я нашел это сейчас, – это:

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

    Чтобы надежно обнаружить дисплей Retina на всех устройствах iOS, вам нужно проверить, работает ли устройство iOS4 +, и если свойство [UIScreen mainScreen].scale равно 2.0. Вы НЕ МОЖЕТЕ предположить, что на устройстве работает iOS4 +, если свойство scale существует, так как iPad 3.2 также содержит это свойство.

    На iPad под управлением iOS3.2 шкала вернет 1.0 в 1x режиме и 2.0 в 2x режиме – хотя мы знаем, что устройство не содержит дисплей Retina. Apple изменила это поведение в iOS4.2 для iPad: он возвращает 1.0 в режимах 1x и 2x. Вы можете проверить это самостоятельно в симуляторе.

    Я тестирую метод -displayLinkWithTarget:selector: на главном экране, который существует в iOS4.x, но не iOS3.2, а затем проверяет масштаб экрана:

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

    Ответ @ sickp правильный. Чтобы упростить задачу, добавьте эту строку в свой файл Shared.pch:

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

    Затем в любом файле вы можете просто сделать:

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

    Этот fragment …

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

    Вернется … 0 для стандартного разрешения iPhone / iPod touch, 1 для сетчатки iPhone, 2 для стандартного разрешения iPad, 3 для сетчатки iPad.

    В SSToolkit есть метод, который делает следующее:

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

    Он используется следующим образом:

     [[UIScreen mainScreen] isRetinaDisplay]; 

    Это всегда кажется немного хитроумным для сравнения значений с плавающей запятой для равенства. Я предпочитаю

     [UIScreen mainScreen].scale > 1.0; 

    или

     [UIScreen mainScreen].scale < 2.0; 

    Вот удобное быстрое расширение:

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

    Применение:

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

    Это рифф на ответ Мэтта Мэт выше. Просто категория на 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 

    Быстрая версия ответов выше, с шкалой> = 2.0, поэтому она включает iPhone 6+ и другие будущие устройства с шкалой более высокой, чем сетчатка:

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

    Чтобы совместить ответ с @sickp и следующий комментарий от @ n13, я сделал это в категорию UIScreen, которая, кажется, работает хорошо. Проверка выполняется при первом ее вызове, а затем сохраняется для последующих вызовов.

     @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 

    Может быть полезно кому-то.

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

    попробуй это

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

    Модифицированная версия primulaveris для простоты большинства распространенных случаев использования. Я на скорости 2,2, но это не имеет значения.

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

    Тогда просто используйте их так

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

    Это сработало для меня

     if((UIScreen .mainScreen().scale) < 2.0) { NSLog("no retina"); } else { NSLog("retina"); } 
    Давайте будем гением компьютера.