Подтвердить что ты не робот

Обнаружение сетчатки сетчатки /iPhone 4 в iPhone SDK

В моем приложении я загружаю некоторые изображения из Интернета (с моего сервера, чтобы быть точным), чтобы сохранить некоторые полосы пропускания и особенно память на телефоне, я предоставляю их в двух разрешениях: 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];

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

4b9b3361

Ответ 1

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

UIScreen.mainScreen.scale

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

Ответ 2

Вот какой код подходит для iOS 3.x и 4.x:

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

Ответ 3

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

Если нам нужно различать 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
               }
         }
    }

Ответ 4

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

UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size

Ответ 5

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

Ответ 6

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

[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];

Ответ 7

UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size

Ответ 8

И для тех, кто просто хочет скопировать/вставить, как определить 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";
        }        
    }
}

Ответ 9

Если вы используете Cocos2d, попробуйте следующее:

[[CCDirector sharedDirector] winSizeInPixels];

Он вернет a CGSize со свойствами width и height.

Ответ 10

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

Ответ 11

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

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

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

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

[UIImage imageNamed:@"image"];

Здесь также отображаются значки приложений и экран загрузки.