web-dev-qa-db-ja.com

Retinaディスプレイの検出

IOS SDKは、currentDeviceに高解像度ディスプレイ(網膜)があるかどうかを確認する簡単な方法を提供しますか?

私が今それをするのに見つけた最良の方法は:

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
         // RETINA DISPLAY
    }
221
Pierre Valade

すべてのiOSデバイスでRetinaディスプレイを確実に検出するには、デバイスがiOS4 +を実行しているかどうか、および[UIScreen mainScreen].scaleプロパティが2.0に等しいかどうかを確認する必要があります。 iPad 3.2にもこのプロパティが含まれているため、scaleプロパティが存在する場合、デバイスがiOS4 +を実行していると想定することはできません。

IOS3.2を実行しているiPadでは、デバイスにRetinaディスプレイが含まれていないことがわかっていても、scaleは1xモードで1.0、2xモードで2.0を返します。 Appleは、iPad用iOS4.2でこの動作を変更しました。1xモードと2xモードの両方で1.0を返します。これはシミュレータで自分でテストできます。

IOS4ではなくiOS3.2ではなくメイン画面で-displayLinkWithTarget:selector:メソッドをテストし、画面のスケールを確認します。

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0)) {
  // Retina display
} else {
  // non-Retina display
}
293
sickp

@sickpの答えは正しいです。簡単にするために、Shared.pchファイルに次の行を追加します。

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))

その後、任意のファイルで次のことができます:

if(IS_RETINA)
{
   // etc..
}
79
Mick Byrne
+(BOOL)iPhoneRetina{
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}
20
Mani

便利なSwift拡張機能を次に示します。

Swift v5:の更新

extension UIScreen {

    public var isRetina: Bool {
        guard let scale = screenScale else {
            return false
        }
        return scale >= 2.0
    }

    public var isRetinaHD: Bool {
        guard let scale = screenScale else {
            return false
        }
        return scale >= 2.0
    }

    private var screenScale: CGFloat? {
        guard UIScreen.main.responds(to: #selector(getter: scale)) else {
            return nil
        }
        return UIScreen.main.scale
    }
}

使用法:

if UIScreen.main.isRetina {
    // Your code
}

オリジナル:

extension UIScreen { 
public func isRetina() -> Bool {
    return screenScale() >= 2.0
}

public func isRetinaHD() -> Bool {
    return screenScale() >= 3.0
}

private func screenScale() -> CGFloat? {
    if UIScreen.mainScreen().respondsToSelector(Selector("scale")) {
        return UIScreen.mainScreen().scale
    }
    return nil
    }
}

使用法:

if UIScreen.mainScreen().isRetina() {
 // your code
        }
6
primulaveris

このスニペット...

    int d = 0; // standard display
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) {
    d = 1; // is retina display
}

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    d += 2;
}

戻ります... 0は標準解像度のiPhone/iPod touch、1はRetina iPhone、2は標準解像度iPad、3はRetina iPadです。

6
Pedro

SSToolkitには、これを行うメソッドがあります。

http://sstoolk.it/documentation/Categories/UIScreen(SSToolkitAdditions).html

次の方法で使用されます。

[[UIScreen mainScreen] isRetinaDisplay];
6
Jorge Perez

浮動小数点の値が等しいかどうかを比較するのは常に少し危険です。私はどちらかに行くことを好む

[UIScreen mainScreen].scale > 1.0;

または

[UIScreen mainScreen].scale < 2.0;
5
skahlert

上記の回答の迅速なバージョン、2.0以上のスケールで、iPhone 6以降およびRetinaスケールよりも高いその他の将来のデバイスが含まれます。

 if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 {
    // code executed only on Retina device
}
2
cdf1982

これは、上記のMatt MCの答えのリフです。 UIScreenの単なるカテゴリ。

#import "UIScreen+Util.h"

@implementation UIScreen (Util)

+ (BOOL) isRetinaDisplay {
    static BOOL retina = NO;
    static BOOL alreadyChecked = NO;
    if (!alreadyChecked) {
        UIScreen *mainScreen = self.mainScreen;
        if (mainScreen) {
            retina = mainScreen.scale > 1.0;
            alreadyChecked = YES;
        }
    }
    return retina;
}

@end
2
Dan Rosenstark
// .h
UIKIT_EXTERN bool isRetinaDisplay();

// .m
bool isRetinaDisplay()
{
    static bool flag;
#ifdef __BLOCKS__
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
        {
            flag = [[UIScreen mainScreen] scale] > 1.0;
        }
        else
        {
            flag = false;
        }
    });
#else
    static bool onceToken;
    if(onceToken == false)
    {
        onceToken = true;
        if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
        {
            flag = [[UIScreen mainScreen] scale] > 1.0;
        }
        else
        {
            flag = false;
        }
    }
#endif
    return flag;
}
1

@sickpからの回答と@ n13からの次のコメントを組み合わせるために、これをうまく動作するように見えるUIScreenカテゴリにしました。このチェックは、最初に呼び出したときに行われ、その後の呼び出しのために保存されます。

@interface UIScreen (RetinaCheck)
+ (BOOL)retinaScreen;
@end

static BOOL isRetinaScreen = NO;
static BOOL didRetinaCheck = NO;

@implementation UIScreen (RetinaCheck)
+ (BOOL)retinaScreen
{
    if (!didRetinaCheck) {
        isRetinaScreen = ([[self mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
                          ([self mainScreen].scale == 2.0));
        didRetinaCheck = YES;
    }
    return isRetinaScreen;
}
@end

誰かに役立つかもしれません。

1
Matt Mc

これを試して

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0))
{
    // Retina display
    NSLog(@"---------------Retina display");
} else {
    // non-Retina display
    NSLog(@"---------------non-Retina display");
}
0
KARTHIK RA

これは私のために働いた

if((UIScreen .mainScreen().scale) < 2.0)
{
    NSLog("no retina");
}
else
{
    NSLog("retina");
}
0
Michael Fretz

最も一般的な使用例の単純化のために、プリムラベリスの修正版。私はSwift 2.2を使用していますが、問題ではありません。

extension UIScreen {
    static var isRetina: Bool {
        return screenScale >= 2.0
    }

    static var isRetinaHD: Bool {
        return screenScale >= 3.0
    }

    static var screenScale:CGFloat {
        return UIScreen.mainScreen().scale
    }
}

次に、このように使用します

print(UIScreen.isRetina)
print(UIScreen.isRetinaHD)
print(UIScreen.screenScale)
0
GregP