如何区分iphone4和iphone 3

我正在尝试使用cocos2d引擎为iPhone构build游戏。 我想知道我怎么能区分用户是否使用iPhone 4或iPhone 3,因为我想加载iPhone4的高分辨率graphics和iPhone 3的低分辨率。我知道如果我使用@ 2x.png在图像文件名的结尾UIImage加载高分辨率图像本身,如果我使用iPhone 4,但对于我使用cocos2d引擎的CCSprite类加载graphics的游戏。

我真的很感激答复。

问候,Ankur

你可以检查屏幕的比例。

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

用于检测包括新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

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

尽pipe苹果的文档说,UIScreen的规模财产不仅在iOS4中可用,它也在iPad上的3.2。 这意味着它可能是一个不可靠的方式来检查你在哪个设备上。

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

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

我在UIScreen上创build了类别来完成此操作。 有关更详细的解释,请参阅我的答案检测视网膜显示 。 代码如下:

 @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 } 

只是加我2美分:

我看到你在这里做什么,但是将它绑定到2.0这样的特定值是好的,但是如果下一个iPad像x1.5那样得到分辨率凸起怎么办? 对于我来说1.0以上的任何东西都是高于正常的显示,所以我会加载高分辨率的graphics。 如果那是iPad,iPhone就不重要了。

我知道这个话题现在有点老了,但它可能会帮助一些人。 在Cocos2d上,您可以使用文件上的-hd后缀加载iphone4的高分辨率graphics和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"); 

有关更多信息,请阅读此处的文档: cocos2d中的RetinaDisplay

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

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

Interesting Posts