以编程方式检测iPad是否具有Retina显示屏?

13

我该如何用编程方式(Objective-C)判断 iPad 是否具有 Retina 显示屏?


7
为什么?通常情况下,你应该检测和调整 特征 而不是具体设备。 - Stephen Darlington
@StephenDarlington - 我的应用程序仅适用于iPad,而新的iPad具有更大的分辨率。我只需要在代码中添加新的屏幕分辨率值即可。 - António
3
@Freedom - 你不需要为新的 iPad 编写不同的代码。视图的框架和定位不会改变。如果你有图片,只需添加双倍尺寸的 @2x 版本即可,但你的代码不会改变,只需添加新的图片文件即可。 - sch
3
@Freedom 实际上并没有更多的空间。屏幕在物理上仍然是相同的尺寸。10pt字体大小仍然是10pt。人们的手指大小仍然是一样的。 - Stephen Darlington
1
@Freedom 不好意思,右侧也不会有额外空间。但是与iPad 2相比,文本会更加清晰。 - Stephen Darlington
显示剩余2条评论
2个回答

19
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale > 1)
{
    // new iPad
}

8
虽然从技术上来说是正确的,但未来所有的iPad也很可能都会返回true(但这可能正是你所需要的)。 - Bartosz Ciechanowski
这回答了问题(检测Retina显示屏)。但是如果你真的需要知道设备版本,请参见此处的答案,该答案可以识别所有设备。 - bobobobo

5

正如其他回答中提到的,您应该检查功能而不是型号。但是,在极少数需要识别特定型号的模糊情况下,您可以使用hw.machine sysctrl,如下所示。请注意,如果无法识别型号,则最有可能是因为您的代码正在新型号上运行,因此在这种情况下应该采取一些明智的措施。

#include <sys/types.h>
#include <sys/sysctl.h>

// Determine the machine name, e.g. "iPhone1,1".
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0); // Get size of data to be returned.
char *name = malloc(size);
sysctlbyname("hw.machine", name, &size, NULL, 0);

NSString *machine = [NSString stringWithCString:name encoding:NSASCIIStringEncoding];
free(name);

现在你可以将“机器”与已知值进行比较。例如,检测iPad(2012年3月)型号:
if ([machine hasPrefix:@"iPad3,"]) NSLog(@"iPad (March 2012) detected");

我已经在iPad(Retina)模拟器上测试了我的应用程序,并且它可以正常运行。我本以为会因为新iPad的新分辨率而出现问题,但我完全错了。无论如何,还是要感谢,这可能对其他人有用。 - António

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接