43

cocos2dエンジンを使ってiPhone用のゲームを作ろうとしています。iphone4の高解像度グラフィックスとiphone3の低解像度グラフィックスをロードしたいので、ユーザーがiphone4とiphone3のどちらを使用しているかをどのように区別できるかを知りたいと思いました。画像ファイル名の末尾UIImageは、iphone 4を使用している場合は高解像度の画像を自動的に読み込みますが、ゲームではcocos2dエンジンのCCSpriteクラスを使用してグラフィックを読み込みます。

返信をいただければ幸いです。

よろしく、アンクル

4

9 に答える 9

123

画面の大きさを確認できます。

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
    //iPhone 4
}
于 2010-07-20T20:31:30.973 に答える
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

于 2012-03-20T12:02:38.523 に答える
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";  
}  
于 2011-01-31T03:37:42.673 に答える
3

Appleのドキュメントによると、UIScreenのscaleプロパティは、iOS4で利用できるだけでなく、iPadの3.2でも利用できます。これは、使用しているデバイスを確認するための信頼性の低い方法であることを意味します。

代わりに、contentScaleFactorがメインウィンドウ(または任意のUIView)で使用可能かどうかを確認してから、スケール値を確認する必要があります。

于 2010-08-25T01:28:46.357 に答える
3

2xモードのiPad3.2のように、プロパティを確認するscaleだけでは不十分です。scaleプロパティは存在し、2.0を返しますが、デバイスにRetinaディスプレイがないことはわかっています。

これを行うために、カテゴリで作成しましたUIScreen。より詳細な説明については、DetectRetinaDisplayに対する私の回答を参照してください。コードは次のとおりです。

@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
}
于 2011-01-09T20:21:14.263 に答える
2

トピックが少し古くなっていることは知っていますが、一部の人には役立つかもしれません。Cocos2dでは、ファイルの-hdサフィックスを使用して、iphone4の高解像度グラフィックスとiphone3の低解像度グラフィックスをロードできます。

前に、次のようにRetinaディスプレイを有効にする必要があります。

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

于 2011-05-03T19:47:02.130 に答える
2

私の2セントを追加するだけです:

ここで何をしているのかわかりますが、これを2.0のような特定の値にバインドするのは今のところ良いのですが、たとえば次のiPadの解像度がx1.5のように上昇した場合はどうでしょうか。私にとって、1.0を超えるものは通常よりも高い表示であるため、高解像度のグラフィックをロードします。それがiPad、iPhoneの場合は、それほど重要ではありません。

于 2011-01-31T03:33:44.167 に答える
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;

    }
}
于 2012-03-08T11:01:39.097 に答える
0

スケールはiPadで使用できますが、if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)を使用して、iPadまたはiPhone/iTouchのどちらであるかを確認できます。

于 2011-09-27T18:58:51.463 に答える