Как различать iphone4 и iphone 3

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

Я был бы очень признателен за ответ.

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

Ответ 1

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

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
    //iPhone 4
}

Ответ 2

Для обнаружения отображения сетчатки на всех устройствах, включая новый 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 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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Проверка свойства 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
}

Ответ 6

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

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

Ответ 7

Я знаю, что эта тема немного устарела, но может помочь некоторым людям. На 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

Ответ 8

импорт "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;

    }
}

Ответ 9

Шкала

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