使用宏检测 iPhone6 和 iPhone6 Plus



我正在尝试检测当前设备是iPhone 5、iPhone 6还是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中时,它们确实按预期工作。什么东西?

此外,如果有人有更好的建议来检测iPhone 5、6和6 Plus,请分享。

这是针对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

不要使用屏幕大小,最好使用硬件型号。我们每年都会得到越来越多的屏幕尺寸,你在代码中硬编码的屏幕尺寸越少,对你未来的自己就越好。

您需要一个helper函数来获取机器名称。我使用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
}

注意:这回答了你的问题(用宏检测模型),但你做得不对。你应该使用自动布局和大小类,除非你支持真正旧的iOS版本。。。

看看这个答案:iOS-如何获得设备制造商和型号?它不使用宏,但它能完成任务。我在检测iPhone 6和iPhone 6 plus的宏中看到了一些类似的问题。因此,最好试试@Ohhmee 的答案

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

您的宏非常荒谬,似乎表明了对浮点运算的恐惧。

#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+的功能感兴趣,请查看功能,而不是屏幕大小。苹果很可能很快就会有一款4英寸的手机,具有iPhone 6的所有功能。或者是一款价格便宜的6c大屏幕手机,但没有iPhone 6的功能。

对于用户界面等,只需使用mainScreen边界并相应地布置视图即可。在这一点上,固定大小的硬编码是绝对荒谬的,会咬你一口。例如,你应该能够在一台12英寸的分屏iPad上毫无问题地运行,天知道屏幕大小

最新更新