在iOS中区分视网膜和非视网膜显示
我试图在viewDidLoad方法中检查视网膜/非视网膜显示,如下所示 调整两个显示器的布局效果良好在iOS中区分视网膜和非视网膜显示,ios,iphone,objective-c,retina-display,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 = FAL
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 *'
如何解决它。
edgesForExtendedLayout
属性仅在iOS7+中。您还应该有条件地检查操作系统版本。如果低于iOS7,则会抛出错误。视网膜设备并不意味着它在iO7上运行。按照rmaddy的建议,检查方法的可用性更准确
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
//Do stuff
}
edgesForExtendedLayout
是在iOS7上添加的,因此它只在与Xcode 5捆绑的基本sdk7.0中可用
您的Xcode 4将使用低于iOS 7的基本sdk版本
参见
仅在iOS 7.0或更高版本中才提供您的错误it自我应答edgesForExtendedLayout
。您可以在运行时使用
您可以简单地将以下代码:-
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
if(floor(NSFoundationVersionNumber)如前所述,edgesForExtendedLayout
仅在iOS 7上可用。Nitin的答案应该可以帮助您避免编译错误
如果希望支持较低版本的iOS,则应使用iOS 7 SDK在Xcode 5中编译,但有条件地定义呈现视图的方式
请参阅苹果的文档:如果要使用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;
}
}
不,不要检查iOS的版本。正确的方法是检查Th方法是否存在。查看scale属性是否存在几乎没有意义。它已经存在了一段时间。我不太可能需要在不存在的地方支持iOS的版本。请检查文档以确定。为什么要将retina与edgesForExtendedLayout设置捆绑在一起?它们彼此无关。最后,为什么要同时使用Xcode 4和5来构建相同的代码?这是一种糟糕的处理方法。请查看Anil的答案以了解正确的方法。如果可能,您应该始终检查属性、方法或类是否存在。仅在没有其他可能的情况下检查操作系统版本方式。为什么要检查显示链接与目标:选择器:
方法?这与它是否是视网膜设备无关。此外,这与原始问题中的问题有什么关系?
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;
}
}