检测视网膜显示

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属性存在,则不能假定设备正在运行iOS4 +,因为iPad 3.2也包含此属性。

在运行iOS3.2的iPad上,即使我们知道该设备不包含Retina显示屏,缩放将在1x模式下返回1.0,在2x模式下返回2.0。 苹果公司在iOS4.2中为iPad改变了这种行为:在1x和2x模式下它返回1.0。 你可以在模拟器中自己testing一下。

我testing了在iOS4.x中存在的主屏幕上的-displayLinkWithTarget:selector:方法,但不是iOS3.2,然后检查屏幕的比例:

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

@ 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; } 

这段代码

  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,1为视网膜iPhone,2为标准分辨率iPad,3为视网膜iPad。

SSToolkit有一个方法是这样的:

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

它以如下方式使用:

 [[UIScreen mainScreen] isRetinaDisplay]; 

对于平等的浮点值来说,总是觉得有点不妥。 我更喜欢去任何一个

 [UIScreen mainScreen].scale > 1.0; 

要么

 [UIScreen mainScreen].scale < 2.0; 

这是一个方便快捷的扩展:

 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 } 

以上是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 

上面的答案的Swift版本,具有> = 2.0的规模,因此它包括iPhone 6+和其他未来具有高于视网膜比例的设备:

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

只是把@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 

可能对某人有用。

 // .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的版本。 我在迅速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) 

这对我有效

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