私のアプリケーションでは、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];
より良い解決策はありますか(多分それは非常に明白ですが、私はそれを逃しました)?
公式のApple Developers Forumsでいくつか読んだだけで、問題はそこで詳細に議論されています。私にとって最良の方法は、scale
のUIScreen
プロパティを使用することです。 iOS 4
以降で利用可能で、あなたが知る必要があるすべてを教えてくれ、将来さらに重要な役割を果たす可能性が高いです(iPadの1024x768の画面解像度が正確に32/15 * 480x320であることにすでに気づいていますか? )。
UIScreen.mainScreen.scale
さらに別のアイデアがある場合は、気軽に投稿してください:)
IOS3.xと4.xの両方で正しい方法でそれを行うためのいくつかのコードを次に示します。
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
スコット・グスタフソンによる回答の更新:
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
}
}
}
この方法で実際の画面サイズ(ピクセル単位)を取得します。
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
- (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;
}
ロビンの答えで行きなさい。もう1つの注意:デバイス名を確認する必要がある場合は、UIDeviceのメソッドを使用してください。
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
そして、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";
}
}
}
+(BOOL)Retina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }
Cocos2dを使用している場合は、次のことを試してください。
[[CCDirector sharedDirector] winSizeInPixels];
プロパティCGSize
およびwidth
を持つheight
を返します。