私はcocos2dエンジンを使用してiphone用のゲームを構築しようとしています。 iphone4の高解像度グラフィックスとiphone 3の低解像度グラフィックスをロードしたいので、ユーザーがiphone 4とiphone 3のどちらを使用しているかを区別する方法を知りたいのですが、@ 2x.pngを使用しているかどうかは画像ファイル名の終わりUIImageは、iphone 4を使用している場合はそれ自体で高解像度画像をロードしますが、ゲームの場合は、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";
}
scale
プロパティの確認だけでは不十分です。iPad3.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
}
Appleのドキュメントによると、UIScreenのスケールプロパティはiOS4だけでなく、iPadの3.2でも利用できます。これは、どのデバイスを使用しているかを確認するための信頼性の低い方法であることを意味します。
代わりに、メインウィンドウ(または任意のUIView)でcontentScaleFactorが使用可能かどうかを確認し、スケール値を確認する必要があります。
ちょうど私の2セントを追加します。
ここでは何をしているのかわかりますが、これを2.0などの特定の値にバインドすることは現時点では適切ですが、たとえば次のiPadにx1.5のような解像度のバンプがある場合はどうでしょうか。私にとって、1.0を超えるものは通常のディスプレイよりも高いので、高解像度グラフィックスをロードします。それがiPad、iPhoneならそれでも構いません...
トピックが少し古いことは知っていますが、一部の人には役立つかもしれません。 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
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で利用できますが、(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)の場合はいつでも使用でき、iPadかiPhone/iTouchかを確認できます