区分iOS中的视网膜和非视网膜显示

时间:2014-01-08 04:49:21

标签: ios iphone objective-c retina-display

我试图在viewDidLoad方法中检查视网膜/非视网膜显示,如下所示

调整两个显示器的布局都可以正常工作。

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

它在xcode 5中工作正常但在xcode 4中构建时出错

以下错误

Property 'edgesForExtendedLayout' not found on object of type 'FirstViewController *'

如何解决它。

6 个答案:

答案 0 :(得分:1)

edgesForExtendedLayout属性仅适用于iOS7 +。您还应该有条件地检查操作系统版本。如果它低于iOS7则会引发错误。视网膜设备并不意味着它在iO7上运行。根据rmaddy

的建议,检查方法的可用性更准确
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
    //Do stuff
}

答案 1 :(得分:1)

在iOS7上添加了

edgesForExtendedLayout,因此它仅在与Xcode 5捆绑在一起的Base SDK 7.0中可用。

您的Xcode 4将使用低于iOS 7的基本sdk版本。

查看UIViewController

的课程参考

答案 2 :(得分:1)

enter image description here

您的自我回答错误edgesForExtendedLayout仅适用于iOS 7.0或更高版本。您可以使用

之类的内容在运行时检查它

你可以简单地输入这段代码: -

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

而不是检查视网膜或非视网膜,你需要检查iOS版本,如: -

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {

        // Load resources for iOS 6.1 or earlier

    } else {

       self.edgesForExtendedLayout=UIRectEdgeNone;
       self.extendedLayoutIncludesOpaqueBars=NO;
       self.automaticallyAdjustsScrollViewInsets=NO;

    }

#define NSFoundationVersionNumber_iOS_4_0  751.32
#define NSFoundationVersionNumber_iOS_4_1  751.37
#define NSFoundationVersionNumber_iOS_4_2  751.49
#define NSFoundationVersionNumber_iOS_4_3  751.49
#define NSFoundationVersionNumber_iOS_5_0  881.00
#define NSFoundationVersionNumber_iOS_5_1  890.10
#define NSFoundationVersionNumber_iOS_6_0  993.00
#define NSFoundationVersionNumber_iOS_6_1  993.00

答案 3 :(得分:0)

如前所述,edgesForExtendedLayout仅适用于iOS 7.Nitin的答案应该可以帮助您避免编译错误。

如果你想支持更低版本的iOS,你应该使用iOS 7 SDK在Xcode 5中编译,但有条件地定义你想要渲染视图的方式。

请参阅Apple的文档:https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW3

答案 4 :(得分:-1)

try this

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");
}

答案 5 :(得分:-2)

如果您想使用edgesForExtendedLayout属性,请使用此代码,因为这是用于管理布局的ios7属性。

NSString *reqSysVer @"7.0"
NSString *currSysVer [[UIDevice currentDevice] systemVersion]
BOOL isRetina = FALSE;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending){
    if (isRetina) {
            self.edgesForExtendedLayout=UIRectEdgeNone;
            self.extendedLayoutIncludesOpaqueBars=NO;
            self.automaticallyAdjustsScrollViewInsets=NO;
    }
}