2014-01-08 56 views
0

我试图检查视网膜/非Retina显示如下的viewDidLoad方法微分视网膜和非视网膜显示器的iOS

这是工作的罚款,以调整布局都显示。

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 *' 

如何解决它。

+0

看到scale属性是否存在没有意义。它已经存在了一段时间了。我不太可能需要支持它不存在的iOS版本。检查文档以确保。 – rmaddy

+0

你为什么要绑定视网膜或不使用edgesForExtendedLayout设置?他们没有任何关系。 – rmaddy

+0

最后,为什么您使用Xcode 4和5来构建相同的代码? – rmaddy

回答

1

edgesForExtendedLayout属性只在iOS7 +。您应该有条件地检查操作系统版本。如果它低于iOS7,则会抛出错误。视网膜设备并不意味着它在iO7上运行。检查方法的有效性是更准确的rmaddy

if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) 
{ 
    //Do stuff 
} 
+4

不,请不要检查iOS的版本。适当的是检查方法是否存在。 – rmaddy

1

edgesForExtendedLayout上iOS7添加为建议,所以它只能在基地SDK 7.0这是捆绑在一起的Xcode 5

您的Xcode提供4将是使用碱SDK版本低于的iOS 7.

看到的UIViewController

1

enter image description here

类参考210

您的错误本人答复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 
-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"); 
} 
+0

你为什么要检查'displayLinkWithTarget:selector:'方法?这与它是否是视网膜设备无关。此外,这与原问题中的问题有什么关系? – rmaddy

-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; 
    } 
} 
+0

这是一个可怕的方式来处理这个问题。请参阅Anil的正确答案。如果可能的话,您应该始终检查是否存在属性,方法或类。只有在没有其他可能的方式时才检查操作系统版本。 – rmaddy