iOS SDK提供了一种简单的方法来检查当前设备是否具有高分辨率显示(retina)吗?
我现在发现最好的方法是:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
iOS SDK提供了一种简单的方法来检查当前设备是否具有高分辨率显示(retina)吗?
我现在发现最好的方法是:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
[UIScreen mainScreen].scale
属性是否等于2.0。如果存在scale
属性,您不能假设设备正在运行iOS4+,因为iPad 3.2也包含该属性。-displayLinkWithTarget: selector:
方法,然后检查屏幕的比例。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];
- Sandy Chapman@selector(displayLinkWithTarget:selector:)
而不是 @selector(scale)
? - Alexander Farber@sickp的答案是正确的。为了使事情更容易,将以下行添加到您的Shared.pch文件中:
#import <UIKit/UIKit.h>
#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
?这不是在重复布尔表达式已经计算出来的结果吗? - d11wtq这里有一个方便的 Swift 扩展:
适用于 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
}
Original:
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] isRetinaDisplay];
This snippet...
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 表示 retina 版本的 iPad。
比较浮点数是否相等总是让人感到有些不可靠。我更喜欢采用以下方式之一:
[UIScreen mainScreen].scale > 1.0;
或者
[UIScreen mainScreen].scale < 2.0;
isRetina = [UIScreen mainScreen].scale > 1.95
的东西。这也将具有对@4x出现时的弹性的好处 :) - Danyal Aytekin以下是与上述答案相对应的Swift版本,使用>= 2.0比例,因此包括iPhone 6+和其他未来具有高于Retina比例的设备:
if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 {
// code executed only on Retina device
}
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
进行缓存是多余的,但没关系。 - Dan Rosenstark只是为了结合@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
,但谁知道未来什么才是有意义的。 - Dan Rosenstark