iOS SDKは、currentDeviceに高解像度ディスプレイ(網膜)があるかどうかを確認する簡単な方法を提供しますか?
私が今それを行うために見つけた最良の方法は:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
iOS SDKは、currentDeviceに高解像度ディスプレイ(網膜)があるかどうかを確認する簡単な方法を提供しますか?
私が今それを行うために見つけた最良の方法は:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
回答:
すべてのiOSデバイスでRetinaディスプレイを確実に検出するには、デバイスがiOS4 +を実行しているかどうか、および[UIScreen mainScreen].scale
プロパティが2.0に等しいかどうかを確認する必要があります。scale
iPad 3.2にもこのプロパティが含まれているため、プロパティが存在する場合、デバイスがiOS4 +を実行していると想定することはできません。
iOS3.2を実行しているiPadでは、デバイスにRetinaディスプレイが含まれていないことがわかっていても、scaleは1xモードでは1.0、2xモードでは2.0を返します。Appleは、iPadのiOS4.2でこの動作を変更しました。1xモードと2xモードの両方で1.0を返します。これはシミュレータで自分でテストできます。
-displayLinkWithTarget:selector:
iOS4.xには存在するがiOS3.2には存在しないメイン画面でメソッドをテストしてから、画面のスケールを確認します。
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) {
// Retina display
} else {
// non-Retina display
}
[UIDevice currentDevice].systemVersion]
ます。この場合、それはなるだろう NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion]; return [currentSystemVersion compare:version options:NSNumericSearch];
@sickpの答えは正しいです。簡単にするために、Shared.pchファイルに次の行を追加します。
#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))
次に、どのファイルでも行うことができます:
if(IS_RETINA)
{
// etc..
}
+(BOOL)iPhoneRetina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}
?1:0
?それは、式のブール部分ですでに計算されていることを繰り返すだけではないですか?
ここに便利な迅速な拡張があります:
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 >= 3.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
}
このスニペット...
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;
}
戻ります...標準解像度のiPhone / iPod touchの場合は0、網膜iPhoneの場合は1、標準解像度iPadの場合は2、網膜iPadの場合は3。
SSToolkitには、これを行うメソッドがあります。
http://sstoolk.it/documentation/Categories/UIScreen(SSToolkitAdditions).html
次のように使用されます。
[[UIScreen mainScreen] isRetinaDisplay];
浮動小数点値が等しいかどうかを比較することは常に少しおかしなことを感じます。私はどちらかに行くことを好む
[UIScreen mainScreen].scale > 1.0;
または
[UIScreen mainScreen].scale < 2.0;
isRetina = [UIScreen mainScreen].scale > 1.95
。これには、@ 4xが発生したときに回復力を
これは、上記の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
alreadyChecked
は不必要だと思いますが、問題ありません。
@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
誰かに役立つかもしれません。
(Util)
代わりにこれを作成すること(RetinaCheck)
です...多分それは不明確ですが、それは他の用途に役立ちます。また、isRetinaDisplay
で始まるメソッドなどに名前を付けますがis
、Obj-Cのガイドラインを理解できなかった可能性があります。また、私はファンです> 1.0
が、前進することに意味があることを知っています。
// .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;
}
これを試して
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");
}
最も一般的な使用例を簡単にするために、primulaverisの修正バージョン。私は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)