iOS SDK是否提供了一种检查currentDevice是否具有高分辨率显示器(视网膜)的简便方法?
我现在发现的最好方法是:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
答案 0 :(得分:293)
为了在所有iOS设备上可靠地检测Retina显示,您需要检查设备是否正在运行iOS4 +以及[UIScreen mainScreen].scale
属性是否等于2.0。如果存在scale
属性,则不能假设设备正在运行iOS4 +,因为iPad 3.2也包含此属性。
在运行iOS3.2的iPad上,刻度将在1x模式下返回1.0,在2x模式下返回2.0 - 即使我们知道该设备不包含Retina显示器。 Apple在iOS4.2中为iPad改变了这种行为:它在1x和2x模式下都返回1.0。您可以在模拟器中自行测试。
我在iOS4.x但不是iOS3.2中的主屏幕上测试-displayLinkWithTarget:selector:
方法,然后检查屏幕的比例:
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) {
// Retina display
} else {
// non-Retina display
}
答案 1 :(得分:79)
@ sickp的回答是正确的。为了简化操作,请将此行添加到Shared.pch文件中:
#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))
然后在任何文件中你都可以:
if(IS_RETINA)
{
// etc..
}
答案 2 :(得分:20)
+(BOOL)iPhoneRetina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}
答案 3 :(得分:6)
这个片段......
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为视网膜iPhone, 2用于标准分辨率iPad, 3为视网膜iPad。
答案 4 :(得分:6)
SSToolkit有一个方法可以做到这一点:
http://sstoolk.it/documentation/Categories/UIScreen(SSToolkitAdditions).html
以下列方式使用:
[[UIScreen mainScreen] isRetinaDisplay];
答案 5 :(得分:6)
这是一个方便的快速扩展:
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 :(得分:5)
比较浮点值是否相等总是感觉有点狡猾。 我更喜欢去
[UIScreen mainScreen].scale > 1.0;
或
[UIScreen mainScreen].scale < 2.0;
答案 7 :(得分:2)
这是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
答案 8 :(得分:2)
以上答案的Swift版本,&gt; = 2.0比例,因此它包括iPhone 6+和其他具有高于Retina标度的未来设备:
if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 {
// code executed only on Retina device
}
答案 9 :(得分: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
可能对某人有用。
答案 10 :(得分:1)
// .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;
}
答案 11 :(得分:0)
试试这个
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");
}
答案 12 :(得分:0)
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)
答案 13 :(得分:0)
这对我有用
if((UIScreen .mainScreen().scale) < 2.0)
{
NSLog("no retina");
}
else
{
NSLog("retina");
}