我正在尝试使用 cocos2d 引擎为 iphone 构建游戏。我想知道如何区分用户使用的是 iphone 4 还是 iphone 3,因为我想为 iphone4 加载高分辨率图形,为 iphone 3 加载低分辨率图形。我知道我是否使用@2x.png at如果我使用的是 iphone 4,图像文件名 UIImage 的末尾会自行加载高分辨率图像,但对于游戏,我使用 cocos2d 引擎的 CCSprite 类来加载图形。
我非常感谢您的回复。
问候, 安库尔
您可以检查屏幕的比例。
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";
}
尽管 Apple 的文档说了什么,但 UIScreen 的 scale 属性不仅在 iOS4 中可用,在 iPad 上的 3.2 中也可用。这意味着检查您使用的设备可能是一种不可靠的方法。
相反,您应该检查 contentScaleFactor 在您的主窗口(或任何 UIView)上是否可用,然后检查比例值。
检查scale
属性是不够的,因为在 2x 模式下的 iPad 3.2 上,该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
}
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;
}
}
我知道这个话题现在有点老了,但它可能会帮助一些人。在 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
只需加上我的 2 美分:
我知道你在这里做什么,但是目前将它绑定到一个特定的值,比如 2.0 是好的,但是如果下一个 iPad 得到像 x1.5 这样的分辨率提升呢?对我来说,任何高于 1.0 的显示都高于正常显示,因此我将加载高分辨率图形。如果那是 iPad,iPhone 没关系....
缩放适用于 iPad,但是您始终可以使用 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 来检查它是 iPad 还是 iPhone/iTouch