iOS视网膜显示检测代码不起作用

时间:2011-04-14 14:01:19

标签: ios detection retina-display

我在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分配给一个浮点数。我找不到任何相关的东西。既然其他人似乎都在使用这种方法,那么我一定会错过一些非常明显的东西吗?顺便说一句,基本SDK版本为4.3,带有XCode 4。

以下是我的BaseSDK /部署目标设置: SDK settings

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这是我使用的代码,可以追溯到3.1(我之前没有测试过):

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

正如@DarkDust所指出的,问题不是你的代码(尽管上面的内容对你来说应该更简单),而是你正在尝试编译 for 3.2,而你真的是应该只是将部署目标设置为3.2,并使用最新的SDK进行编译。

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

相关问题