web-dev-qa-db-ja.com

iPhoneSDKでRetinaスクリーン/ iPhone4を検出する

私のアプリケーションでは、Webから(正確にはサーバーから)いくつかの画像をダウンロードしています。帯域幅、特に電話のメモリを節約するために、2つの解像度で提供しています。「古い」iPhoneシリーズ用の480x320と網膜ディスプレイを備えたiPhone4の場合は960x640。ここで、Retina画面をサポートするデバイスで実行されている場合、アプリ内から検出できるようにする必要があります。どうすればそれができますか?

以下のコードスニペットを使用することを考えていました。これにより、たとえば、特定のデバイス識別子が返されます。 「iPhone3」、それでも私は検出をiPhone4に限定し、網膜ディスプレイを備えた後続のデバイス用にそのコードを更新する必要があります。

size_t size;

// Set 'oldp' parameter to NULL to get the size of the data
// returned so we can allocate appropriate amount of space
sysctlbyname("hw.machine", NULL, &size, NULL, 0); 

// Allocate the space to store name
char *name = malloc(size);

// Get the platform name
sysctlbyname("hw.machine", name, &size, NULL, 0);

// Place name into a string
NSString *machine = [NSString stringWithCString:name];

より良い解決策はありますか(多分それは非常に明白ですが、私はそれを逃しました)?

23
Robin

公式のApple Developers Forumsでいくつか読んだだけで、問題はそこで詳細に議論されています。私にとって最良の方法は、scaleUIScreenプロパティを使用することです。 iOS 4以降で利用可能で、あなたが知る必要があるすべてを教えてくれ、将来さらに重要な役割を果たす可能性が高いです(iPadの1024x768の画面解像度が正確に32/15 * 480x320であることにすでに気づいていますか? )。

UIScreen.mainScreen.scale

さらに別のアイデアがある場合は、気軽に投稿してください:)

32
Robin

IOS3.xと4.xの両方で正しい方法でそれを行うためのいくつかのコードを次に示します。

BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0) {
        hasHighResScreen = YES;
    }
}
23
Scott Gustafson

スコット・グスタフソンによる回答の更新:

IPad/Retina/iPhoneを区別する必要がある場合:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    {
        CGFloat scale = [[UIScreen mainScreen] scale];

           if (scale > 1.0) 
           {
                //iPad retina screen
           }  
           else
           {
                //iPad screen
           }
    } 
    else
    {
         if ([UIScreen instancesRespondToSelector:@selector(scale)]) 
         {
               CGFloat scale = [[UIScreen mainScreen] scale];

               if (scale > 1.0) 
               {
                    if([[ UIScreen mainScreen ] bounds ].size.height == 568)
                    {
                        //iphone 5
                    }
                    else
                    {
                        //iphone retina screen
                    }
               }
               else
               {
                    //iphone screen
               }
         }
    }
13

この方法で実際の画面サイズ(ピクセル単位)を取得します。

UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
5
PaperBirdMaster
- (BOOL)isRetina {

    BOOL isRetina = NO;

    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale > 1.0) {
            isRetina = YES;
        }
    }

    return isRetina;
}


- (CGSize)sizeInPixels {

    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    CGSize screenSize = CGSizeMake(appFrame.size.width, appFrame.size.height);

    return [self isRetina] ? CGSizeMake(screenSize.width * 2, screenSize.height * 2) : screenSize;
}
3
berec

ロビンの答えで行きなさい。もう1つの注意:デバイス名を確認する必要がある場合は、UIDeviceのメソッドを使用してください。

[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];
1
Matt Rix
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
1
anup

そして、iphone/iphone_retina/ipad/ipad_retinaを検出する方法をコピーして貼り付けたいだけの人のために、このスレッドを読んだ後に私がやったことは次のとおりです。 Guntis Treulandsの貢献に大きく影響を受け、GuntisTreulandsはScottGustafsonsの回答をさらに拡大しました。

- (NSString *) yesButWhichDeviceIsIt {    
    BOOL hasRetina = NO;
    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale > 1.0) {
            hasRetina = YES;
        }
    }
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        if (hasRetina) {
            return @"iPad retina";
        } else {
            return @"iPad";
        }
    } else {
        if (hasRetina) {
            return @"iPhone retina";
        } else {
            return @"iPhone";
        }        
    }
}
1
thomax
+(BOOL)Retina{
        return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }
0
Mani

Cocos2dを使用している場合は、次のことを試してください。

[[CCDirector sharedDirector] winSizeInPixels];

プロパティCGSizeおよびwidthを持つheightを返します。

0
codeperson