Как провести различие между iphone4 и iphone 3 - PullRequest
43 голосов
/ 21 июля 2010

Я пытаюсь собрать игру для iphone, используя движок cocos2d. Я хотел знать, как я могу определить разницу, использует ли пользователь iphone 4 или iphone 3, поскольку я хотел загрузить графику с высоким разрешением для iphone4 и низкое разрешение для iphone 3. Я знаю, использую ли я @ 2x.png конец имени файла изображения UIImage загружает изображение высокого разрешения само по себе, если я использую iphone 4, но для игры я использую класс CCSprite движка cocos2d для загрузки графики.

Буду очень признателен за ответ.

С уважением, Анкур

Ответы [ 9 ]

123 голосов
/ 21 июля 2010

Вы можете проверить масштаб экрана.

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
    //iPhone 4
}
12 голосов
/ 20 марта 2012

Для обнаружения дисплея сетчатки на всех устройствах, включая новый iPad

    +(BOOL)isRetinaDisplay {
    // since we call this alot, cache it
    static CGFloat scale = 0.0;
    if (scale == 0.0) {
        // NOTE: In order to detect the Retina display reliably on all iOS devices,
        // you need to check if the device is running iOS4+ and if the 
        // [UIScreen mainScreen].scale property is equal to 2.0. 
        // You CANNOT assume a device is running iOS4+ if the scale property exists,
        // as the iPad 3.2 also contains this property.
        // On an iPad running iOS3.2, scale will return 1.0 in 1x mode, and 2.0
        // in 2x mode -- even though we know that device does not contain a Retina display.
        // Apple changed this behavior in iOS4.2 for the iPad: it returns 1.0 in both
        // 1x and 2x modes. You can test this yourself in the simulator.
        // I test for the -displayLinkWithTarget:selector: method on the main screen
        // which exists in iOS4.x but not iOS3.2, and then check the screen's scale:

        if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && 
            ([UIScreen mainScreen].scale == 2.0)) {
            scale = 2.0;
            return YES;
        } else {
            scale = 1.0;
            return NO;
        }   

    }
    return scale > 1.0;
}

Кредит: Адриано Паладини http://developer.appcelerator.com/question/133826/detecting-new-ipad-3-dpi-and-retina

5 голосов
/ 31 января 2011
- (NSString *) platform  
{  
    size_t size;  
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);  
    char *machine = malloc(size);  
    sysctlbyname("hw.machine", machine, &size, NULL, 0);  
    NSString *platform = [NSString stringWithCString:machine];  
    free(machine);  
    return platform;  
}  

- (NSString *) platformString  
{  
    NSString *platform = [self platform];  
    if ([platform isEqualToString:@"iPhone1,1"]) return @"Original iPhone";  
    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";  
    if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3G[S]"; 
    if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";   
    return @"Unknown";  
}  
3 голосов
/ 09 января 2011

Проверка свойства scale недостаточна, так как на iPad 3.2 в режиме 2x свойство scale существует и вернет 2.0, но мы знаем, что устройство НЕ имеет дисплей Retina.

Я создал в категории на UIScreen, чтобы сделать это.Для более подробного объяснения см. Мой ответ на Обнаружение Retina Display .Вот код:

@interface UIScreen(ZBScreenRetinaAdditions)

// Returns YES if this is a Retina display.
- (BOOL)zb_isRetina;

@end

@implementation UIScreen(ZBScreenRetinaAdditions)

- (BOOL)zb_isRetina {
  return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0);
}

@end

Пример использования:

if ([UIScreen mainScreen] zb_isRetina) {
  // Retina display
}
3 голосов
/ 25 августа 2010

Несмотря на то, что говорят документы Apple, свойство масштаба UIScreen доступно не только в iOS4, но и в версии 3.2 на iPad.Это означает, что это, вероятно, ненадежный способ проверить, на каком устройстве вы находитесь.

Вместо этого вы должны проверить, доступен ли contentScaleFactor в главном окне (или любом UIView), а затем проверить значение масштаба.

2 голосов
/ 08 марта 2012

импорт "UIScreen + Retina.h"

if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){
    //IPAD        
    if ([[UIScreen mainScreen] isRetina]) {
        // IPAD 3 - Retina display
        bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_HIGHRES;            
    }else{
        //iPAD 1/2
        bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_LOWRES;        }
}else{
    //IPHONE
    if ([[UIScreen mainScreen] isRetina]) {
        // IPHONE 4/4s/5 - Retina display
        bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_HIGHRES;

    }else{
        //IPHONE (3.x)
        bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_LOWRES;

    }
}
2 голосов
/ 03 мая 2011

Я знаю, что тема немного устарела, но она может помочь некоторым людям.На Cocos2d вы можете загружать графику с высоким разрешением для iphone4 и низкое разрешение для iphone 3, используя суффикс -hd в своих файлах.

Вы просто должны включить отображение сетчатки, как это раньше:

// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
if( ! [director enableRetinaDisplay:YES] )
    CCLOG(@"Retina Display Not supported");

Для получения дополнительной информации прочитайте документацию здесь: RetinaDisplay в cocos2d

2 голосов
/ 31 января 2011

просто добавив мои 2 цента:

Я вижу, что вы здесь делаете, но привязка этого к определенному значению, например 2.0, пока хороша, но что, если, например, следующий iPad получит увеличение разрешения, такое как x1.5?Для меня все, что выше 1,0, является чем-то большим, чем обычно, поэтому я буду загружать графику высокого разрешения.Не имеет большого значения, если это iPad, iPhone ....

0 голосов
/ 27 сентября 2011
* Масштаб

доступен для iPad, однако вы всегда можете использовать if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPad), чтобы проверить, является ли это iPad или iPhone / iTouch

...