iOS SDK是否提供了一种简单的方法来检查currentDevice是否具有高分辨率的显示器(retina) ?
我现在发现的最好的方法是:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
iOS SDK是否提供了一种简单的方法来检查currentDevice是否具有高分辨率的显示器(retina) ?
我现在发现的最好的方法是:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
当前回答
这个代码片段……
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视网膜iPad。
其他回答
为了在所有iOS设备上可靠地检测视网膜显示,你需要检查设备是否运行iOS4+,以及[UIScreen mainScreen]。缩放属性等于2.0。如果scale属性存在,你不能假设设备正在运行iOS4+,因为iPad 3.2也包含这个属性。
在运行iOS3.2的iPad上,比例在1倍模式下将返回1.0,在2倍模式下将返回2.0——尽管我们知道该设备不包含视网膜显示屏。苹果在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
}
+(BOOL)iPhoneRetina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.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
}
比较浮点值是否相等总是让人感觉有点不可靠。 两者我都喜欢
[UIScreen mainScreen].scale > 1.0;
or
[UIScreen mainScreen].scale < 2.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;
}
将返回…… 0为标准分辨率iPhone/iPod touch, 1为retina iPhone, 2用于标准分辨率的iPad, 3视网膜iPad。