2011-04-14 93 views
2

我在检测iOS设备上的视网膜显示时出现问题。我使用的是建议由不同的人下面的代码:iOS视网膜显示检测代码不起作用

BOOL isRetina() 
{ 
    UIScreen* s = [UIScreen mainScreen]; 
    if ([s respondsToSelector:@selector(displayLinkWithTarget:selector:)] && 
     [s respondsToSelector:@selector(scale)]) 
    { 
     CGFloat scale = [s scale]; 
     return scale == 2.0; 
    } 

    return NO; 
} 

的问题是,它编译罚款部署目标的iOS 4或更高,但是当我编译iOS3.2我得到一个“不兼容类型在初始化“错误在”scale = [s scale]“行,因为我试图将一个id分配给一个浮点数。我找不到任何关于此的信息。由于其他人似乎都在使用这种方法,我必须在这里错过一些非常明显的东西?顺便说一下,使用XCode 4的Base SDK版本是4.3。

这里是我的BaseSDK /部署目标设置: SDK settings

更新:我已经解决了它。基本上问题是一些XCode问题。要解决一些其他问题,我必须卸载并重新安装XCode。之后,行为消失了。

+0

而只是将结果投入浮动不起作用? (即''CGFloat scale =(CGFloat)[s scale];') – jv42 2011-04-14 14:09:56

+0

不,您不能将指针类型转换为浮点型。我已经尝试过了。甚至试图通过无效*。 – Gottfried 2011-04-14 14:34:34

+0

当然,因为我有一段时间不在ObjC,所以我忘记了它的一些内在细节。祝你好运! – jv42 2011-04-14 15:03:13

回答

1

在iOS 3.2中,未定义符号-[UIScreen scale],因此编译器假定在使用iOS SDK 3.2编译时默认返回id。因此警告。

理解SDK against which you compile and the deployment target的区别非常重要。您通常希望针对最新的SDK编译,但您设置了一个部署目标您希望支持的最低iOS版本。

+0

这是有趣的事情,我已经知道:我的基础SDK设置为4.3。我的部署目标是3.2。但是,当我选择为例如在XCode的iPad 3.2模拟器,然后我得到这个错误。 – Gottfried 2011-04-14 14:26:48

+1

@Gottfried:这是因为在这种情况下,Base SDK设置为3.2。 – DarkDust 2011-04-14 14:37:08

+0

我附上了我的Base SDK设置的截图。他们似乎没问题。 – Gottfried 2011-04-14 14:49:10

1

这里是我使用的代码,工程早在3.1(我没有早于测试):

BOOL isRetina; 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){ 
    isRetina = YES; 
} else { 
    isRetina = NO; 
} 

正如指出的@DarkDust这个问题是不是真的是你的代码(尽管上面应该对你更简单),这是你试图编译为3.2,真的你应该只是将你的部署目标设置为3.2,仍然使用最新的SDK编译。

不同之处在于,当您为较旧的SDK进行编译时,它将无法生成,因为它知道它无法调用该方法(scale) - 即使它实际上不会到达该行代码。但是,如果您已经正确设置了部署目标,则可以在3.2上使用您的代码,而不必担心,因为您知道scale方法永远不会被调用,因为您已验证它不存在。

+0

请阅读我的评论@DarkDust。基本上我意识到,不知何故Xcode构建使用3.2作为基础sdk,但在我的Xcode设置它说基本sdk 4.3,部署目标3.2。但我确信自从我切换到XCode 4后我错过了一些东西我有点困惑:) – Gottfried 2011-04-14 14:33:42