【问题标题】:Detecting iPhone6 & iPhone6 Plus using macros使用宏检测 iPhone6 和 iPhone6 Plus
【发布时间】:2014-11-26 16:19:24
【问题描述】:

我正在尝试检测当前设备是 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 的建议,请分享。

【问题讨论】:

  • 你认为你为什么需要这样的宏?你用它们做什么?
  • 在 iOS 8 下,当应用程序以横向启动时,您的宏都不起作用,因为在 iOS 8 下,屏幕大小实际上反映了应用程序的方向。在 iOS 7 和更早的版本中,屏幕尺寸从不反映实际的设备方向。
  • 您是否在设备方向转换结束后使用宏?您的目标支持哪些设备方向?
  • @rmaddy 我需要这些,因为我的应用在旋转到横向时包含自定义表格视图。此表格视图被格式化为根据复杂的托管对象模式相应地显示列标题和行。在 iPhone 4 上,只有这么多的屏幕空间可以显示 x 列。当 iPhone 5 出来时,我利用了屏幕尺寸,以便我可以显示更多的列,这将提供 iPhone 4 无法容纳的额外信息。现在我希望利用 iPhone 6 的屏幕尺寸来显示更多信息以获得更完整的表格。
  • 好的。那挺好的。但是为什么要基于设备硬编码逻辑呢?为什么不简单地查看当前视图大小并显示适合的内容?然后,您的应用可以在所有设备和方向上运行,而无需疯狂的设备和方向特定逻辑。

标签: ios iphone macros ios8 device


【解决方案1】:

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

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

【讨论】:

  • 这不能回答问题,检查设备型号很少是合适的解决方案。
  • 它确实回答了这个问题,因为他说:'另外,如果有人有更好的建议来检测 iPhone5、6 和 6 Plus,请分享。
  • 糟糕。我想我没有读到最后一行。好的。但是我评论的后半部分仍然有效(对 OP 来说比对回答者更重要)。很少有人使用这些宏或使用设备模型字符串是有正当理由的。当 Apple 再次推出不同尺寸的设备时,这样的代码将再次崩溃。
【解决方案2】:

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

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

对于用户界面等,只需获取 mainScreen 边界并相应地布置您的视图。在这一点上,固定大小的硬编码绝对是荒谬的,会咬你的。例如,你应该可以在 12 英寸 iPad 上运行分屏而不会出现问题,而且天知道那会是什么屏幕尺寸。

【讨论】:

  • 投反对票,因为 == 与浮点比较通常确实是一个坏主意,甚至还有一个编译器警告可以启用(-Wfloat-equalread description here)。例如。 a = 0.15 + 0.15b = 0.1 + 0.2,两者都是 0.30,但 a == bNOT 保证为浮点标准。这与对浮点运算的恐惧无关,您的回答反而表明对浮点运算缺乏了解。还要注意你的措辞,称他们为 可笑 不是正确的语气。
【解决方案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
}

注意:这回答了您的问题(使用宏检测模型),但恕我直言,您做错了。你应该使用自动布局和大小类,除非你支持非常旧的 iOS 版本......

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多