如何在iphone和ipad的通用应用程序中调用[[UIScreen mainScreen] scale]

时间:2010-06-28 06:18:38

标签: iphone ipad ios4

我正在制作一款可在ipad和iphone上运行的通用应用。到目前为止一切都那么好,但我刚刚将我的SDK更新为ios4并希望调用[[UIScreen mainScreen] scale](缩放不在3.2 sdk中,而ipad还没有ios4)。

我知道我可以调用[[UIScreen mainScreen] respondsToSelector:@selector(scale)]来查明我是否可以调用它,但是我仍然需要调用函数(并且能够访问返回值)在我的代码中,它可以在iPhone上运行。

编辑:要清楚,我的问题是在构建3.2 SDK时使用代码[[UIScreen mainScreen] scale]时出错。此错误是“分配中的不兼容类型”。所以我需要能够仍然为4.0 SDK调用此函数,但仍然有3.2 SDK的项目构建。

3 个答案:

答案 0 :(得分:4)

好吧,您可以在if语句中包含对它的每次调用,如下所示:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    //do scale stuff here
}

但更好的方法(可能需要重组整个应用程序)是为iPad和iPhone配备独立的视图控制器。

要获得跨平台视图或其他设备的规模,您可以这样做:

CGFloat scale;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale=[[UIScreen mainScreen] scale];
} else {
    scale=1; //only called on iPad.
}

为避免每次都输入此内容,您可以在UIScreen上声明一个类别,该类别在-realScale方法或其他内容中使用此代码。

所有这些方法都需要将基本SDK设置为4.0(以便您可以访问4.0 API)并将最低iPhone部署目标设置为3.2(因此它将在iPad上运行)

答案 1 :(得分:1)

哎呀。错了。

  • 将“Base SDK”设置为iPhone OS 4.0
  • 将“iPhone OS部署目标”设置为iPhone OS 3.2。

答案 2 :(得分:0)

我在问我的问题之前最终找到了一个解决方案,但我花了很长时间才弄清楚我决定发布我的问题和答案,以防它帮助其他人。

这是我能够在[UIScreen主屏幕]上调用选择器比例并且仍然具有ipad版本构建的方式:

CGFloat screenScale;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    //iphones with the latest SDK should end up in here (and also ipads when they are updated)
    NSMethodSignature * scaleSignature = [UIScreen instanceMethodSignatureForSelector:@selector(scale)];
    NSInvocation * scaleInvocation = [NSInvocation invocationWithMethodSignature:scaleSignature];
    [scaleInvocation setTarget:[UIScreen mainScreen]];
    [scaleInvocation setSelector:@selector(scale)];
    [scaleInvocation invoke];

    NSInteger returnLength = [[scaleInvocation methodSignature] methodReturnLength];
    //good memory management to check this in case anything changed in the future
    if (returnLength == sizeof(CGFloat)) {
        [scaleInvocation getReturnValue:&screenScale];
    } else {
        //default value
        screenScale = 1.0f;
    }
} else {
    //ipad (for now) and other SDK < 4.0 should come here
    screenScale = 1.0f;
}