我正在制作一款可在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的项目构建。
答案 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)
哎呀。错了。
答案 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;
}