如何区分iphone4和iphone 3

时间:2010-07-20 20:29:36

标签: ios ccsprite

我正在尝试使用cocos2d引擎为iphone构建游戏。我想知道如何区分用户是使用iphone 4还是iphone 3,因为我想加载iphone4的高分辨率图形和iphone 3的低分辨率。我知道我是否使用@ 2x.png如果我正在使用iphone 4,则图像文件名UIImage的末尾会自动加载高分辨率图像,但对于游戏,我使用cocos2d引擎的CCSprite类来加载图形。

我真的很感激回复。

此致 ANKUR

9 个答案:

答案 0 :(得分:123)

您可以检查屏幕的比例。

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

答案 1 :(得分:12)

用于检测所有设备上的视网膜显示,包括新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;
}

感谢:Adriano Paladini http://developer.appcelerator.com/question/133826/detecting-new-ipad-3-dpi-and-retina

答案 2 :(得分:5)

- (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 :(得分:3)

尽管Apple的文档说的是,UIScreen的规模属性不仅适用于iOS4,它也可以在iPad上使用3.2。这意味着检查您所使用的设备可能是一种不可靠的方法。

相反,您应该检查主窗口(或任何UIView)上的contentScaleFactor是否可用,然后检查比例值。

答案 4 :(得分:3)

检查scale属性是不够的,因为iPad 3.2在2x模式下,scale属性存在且将返回2.0,但我们知道该设备没有Retina显示。

我在UIScreen的类别上创建了这样做。有关更详细的说明,请参阅我对Detect 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
}

答案 5 :(得分:2)

加上我的2美分:

我看到你在这里做了什么,但是将它绑定到像2.0这样的特定值是有利的,但是如果例如下一个iPad得到像x1.5一样的分辨率呢?对我来说,高于1.0的任何东西都是高于正常的显示,所以我将加载高分辨率图形。如果那是iPad,iPhone那么无关紧要......

答案 6 :(得分:2)

我知道这个话题现在有点老了,但它可能对某些人有所帮助。 在Cocos2d上,您可以使用文件上的-hd后缀为iphone4加载高分辨率图形,为iphone 3加载低分辨率图像。

您必须在此之前启用这样的视网膜显示:

// 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 in cocos2d

答案 7 :(得分:2)

导入“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;

    }
}

答案 8 :(得分:0)

刻度适用于iPad,但您可以随时使用if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)来检查它是iPad还是iPhone / iTouch