Обнаружение экрана сетчатки / iPhone 4 в iPhone SDK - PullRequest
23 голосов
/ 17 июля 2010

В своем приложении я загружаю некоторые изображения из Интернета (если быть точным, с моего сервера), чтобы сэкономить пропускную способность и особенно память на телефоне, я предоставляю их в двух разрешениях: 480x320 для «старого» iPhone серии и в 960x640 для iPhone 4 с дисплеем сетчатки. Теперь мне нужно иметь возможность определять из приложения, когда оно работает на устройстве, которое поддерживает экран сетчатки. Как я мог это сделать?

Я думал об использовании приведенного ниже фрагмента кода, который вернул бы мне определенный идентификатор устройства, например, например. «iPhone3», но тогда я бы ограничил обнаружение iPhone4 и должен был бы обновить этот код для любого последующего устройства с дисплеем сетчатки.

size_t size;

// Set 'oldp' parameter to NULL to get the size of the data
// returned so we can allocate appropriate amount of space
sysctlbyname("hw.machine", NULL, &size, NULL, 0); 

// Allocate the space to store name
char *name = malloc(size);

// Get the platform name
sysctlbyname("hw.machine", name, &size, NULL, 0);

// Place name into a string
NSString *machine = [NSString stringWithCString:name];

Есть ли лучшее решение (может быть, это очень очевидно, но я его пропустил)?

Ответы [ 11 ]

32 голосов
/ 17 июля 2010

Только что прочитал на официальных форумах разработчиков Apple, и вопросы там подробно обсуждались. На мой взгляд, лучшим способом является использование свойства scale UIScreen. Хотя он доступен только в iOS 4 и более поздних версиях, он расскажет вам все, что вам нужно знать, и, скорее всего, будет играть еще более важную роль в будущем (уже заметил, что разрешение экрана iPad 1024x768 составляет ровно 32/15 * 480x320?).

UIScreen.mainScreen.scale

Если у вас есть еще одна идея, не стесняйтесь опубликовать ее:)

23 голосов
/ 28 августа 2010

Вот код для правильной работы iOS 3.x и 4.x:

BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0) {
        hasHighResScreen = YES;
    }
}
13 голосов
/ 30 сентября 2011

Небольшое обновление ответа Скотта Густафсона:

Если мы должны различать iPad / Retina / iphone:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    {
        CGFloat scale = [[UIScreen mainScreen] scale];

           if (scale > 1.0) 
           {
                //iPad retina screen
           }  
           else
           {
                //iPad screen
           }
    } 
    else
    {
         if ([UIScreen instancesRespondToSelector:@selector(scale)]) 
         {
               CGFloat scale = [[UIScreen mainScreen] scale];

               if (scale > 1.0) 
               {
                    if([[ UIScreen mainScreen ] bounds ].size.height == 568)
                    {
                        //iphone 5
                    }
                    else
                    {
                        //iphone retina screen
                    }
               }
               else
               {
                    //iphone screen
               }
         }
    }
5 голосов
/ 06 ноября 2010

Я получаю реальный размер экрана (в пикселях) следующим образом:

UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
3 голосов
/ 05 июля 2012
- (BOOL)isRetina {

    BOOL isRetina = NO;

    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale > 1.0) {
            isRetina = YES;
        }
    }

    return isRetina;
}


- (CGSize)sizeInPixels {

    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    CGSize screenSize = CGSizeMake(appFrame.size.width, appFrame.size.height);

    return [self isRetina] ? CGSizeMake(screenSize.width * 2, screenSize.height * 2) : screenSize;
}
1 голос
/ 07 мая 2012

А для тех, кто просто хочет скопировать / вставить способ определения iphone / iphone_retina / ipad / ipad_retina, вот что я закончил делать после прочтения этой темы. Сильно вдохновлен вкладом Гунтиса Треланда, который в свою очередь расширил ответ Скотта Густафсона.

- (NSString *) yesButWhichDeviceIsIt {    
    BOOL hasRetina = NO;
    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale > 1.0) {
            hasRetina = YES;
        }
    }
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        if (hasRetina) {
            return @"iPad retina";
        } else {
            return @"iPad";
        }
    } else {
        if (hasRetina) {
            return @"iPhone retina";
        } else {
            return @"iPhone";
        }        
    }
}
1 голос
/ 26 ноября 2010
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
1 голос
/ 15 августа 2010

С ответом Робина. Еще одно замечание: если вам нужно проверить имя устройства, просто используйте методы на UIDevice.

[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];
0 голосов
/ 23 мая 2012
+(BOOL)Retina{
        return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }
0 голосов
/ 20 декабря 2011

Несмотря на то, что вы уже выбрали ответ, есть гораздо более простой способ, когда вы имеете дело с изображениями, поэтому я также упомяну его.

Если вы включаете в свой пакет два изображения двух размеров (320x480 и 640x960) и добавляете «@ 2x» в конце имени файла последнего изображения, [UIImage imageNamed:] автоматически выберет меньшее изображениедля старых устройств и 2x для устройств с дисплеем Retina при условии, что вы не указали суффикс изображения.Пример:

2 изображения с именами @ "image.png" и @ "image@2x.png", оба включены в комплект приложения.

Затем вызовите:

[UIImage imageNamed:@"image"];

Так же работают значки приложений и экран загрузки.

...