检测iPhone6& iPhone6 Plus使用宏

时间:2014-10-01 18:18:07

标签: ios iphone macros ios8 device

我正在尝试检测当前设备是iPhone5,iPhone6还是iPhone 6 Plus。

在我的应用程序中,我已经使用此宏来检测完美运行的iPhone 5.

#define IS_IPHONE_5      (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)

同样,我使用此宏来检测iPhone 6和iPhone 6 Plus。

#define IS_IPHONE_6      (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)

IS_IPHONE_5宏在任何方向都按预期工作。

我的问题是当设备保存在LANDSCAPE中时,IS_IPHONE_6和IS_IPHONE_6_PLUS宏不会返回true。但是,当设备在PORTRAIT中保存时,它们确实可以正常工作。是什么给了什么?

如果有人有更好的建议来检测iPhone5,6和6 Plus请分享。

4 个答案:

答案 0 :(得分:8)

这是针对iOS系统版本和SDK版本的任意组合进行测试和设计的

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

注意:如果iPhone 6处于缩放模式,则UI是iPhone 5的放大版本。这将反映在宏中。

用法:http://pastie.org/9687735

答案 1 :(得分:3)

请勿使用屏幕尺寸,最好使用硬件型号。我们每年获得越来越多的屏幕尺寸,您在代码中硬编码屏幕尺寸越少,对您未来的自我感觉就越好。

您需要一个辅助函数来获取计算机名称。我正在使用dispatch_once来避免多次查询系统以查找不会发生变化的数据。

NSString* machineName()
{
    static NSString* name = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        struct utsname systemInfo;
        uname(&systemInfo);
        name = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    });
    return name;
}

然后根据需要定义一些宏:

#define IS_IPHONE_6      [machineName() isEqualToString:@"iPhone7,2"]
#define IS_IPHONE_6_PLUS [machineName() isEqualToString:@"iPhone7,1"]

对于某些型号来说比较棘手:

#define IS_IPHONE_5s     [machineName() hasPrefix:@"iPhone6,"]

最后,在代码中使用宏:

if (IS_IPHONE_6) {
// for the 6
}

注意:这回答你的问题(检测带有宏的模型),但你做错了恕我直言。您应该使用autolayout和size类,除非您支持真正的旧iOS版本......

答案 2 :(得分:1)

看一下这个答案:iOS - How to get device make and model?它不会使用宏,但它可以完成这项工作。我已经看到了一些类似的宏检测iPhone 6和iPhone 6 plus的问题。所以从@Ohhmee

中尝试答案会更好

编辑:当然可能有一个用宏检测它的解决方案。但我不知道,我找不到解决方案,所以我建议采用不同的方法。

答案 3 :(得分:0)

你的宏很荒谬,似乎表明了对浮点运算的恐惧。

#define IS_IPHONE_5      ([UIScreen mainScreen].bounds.size.height == 568)
#define IS_IPHONE_6      ([UIScreen mainScreen].bounds.size.height == 667)
#define IS_IPHONE_6_PLUS ([UIScreen mainScreen].bounds.size.height == 736)

将同样有效(或同样糟糕)。他们很可能会像坏人一样工作。

如果您对iPhone 6或6+的功能感兴趣,请检查功能,而不是屏幕尺寸。苹果很快就会推出一款具有所有iPhone 6功能的4英寸手机。或者是具有大屏幕且没有iPhone 6功能的廉价6c手机。

对于用户界面等,只需获取主屏幕边界并相应地布置视图。在这一点上,固定大小的硬编码绝对是荒谬的,会咬你。你应该能够在没有问题的12英寸iPad屏幕上运行,天堂知道屏幕尺寸。