检测视网膜显示
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"); }