【问题标题】:Objective-C macro that checks the device [duplicate]检查设备的Objective-C宏[重复]
【发布时间】:2013-03-13 16:39:56
【问题描述】:

我需要一个宏来确定设备是 iPhone 4 还是 iPhone 5。有人告诉我有一个宏可以做到这一点。有谁知道它是什么或我在哪里可以找到它?

【问题讨论】:

  • 你不能使用宏,你需要在运行时检查

标签: ios objective-c macros c-preprocessor


【解决方案1】:

我找到了一个可以解决问题的方法

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

【讨论】:

    【解决方案2】:

    不幸的是,不仅没有宏,甚至没有返回设备类型的公共 API 调用,它可以区分不同版本的 iPhone(例如 iPhone 4 和 iPhone5)。

    设备检测

    您可以使用UI_USER_INTERFACE_IDIOM 宏来确定用户是在 iPhone/iPod 还是 iPad 上运行:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
         // The device is an iPad running iOS 3.2 or later.
    }
    else {
         // The device is an iPhone or iPod touch.
    }
    

    取自iOS App Programming Guide的'Advanced App Tricks部分。

    屏幕尺寸检测

    关于普遍支持多种屏幕尺寸和 iPhone 4 和 iPhone 5,iOS App Programming Guide 指出:

    要在您的代码中正确支持更大的屏幕,切勿对当前设备的屏幕尺寸做出假设。相反,始终动态检索屏幕、窗口或视图的大小,并使用该大小信息来配置您的界面。您还应该使用基于视图的约束来构建用户界面,这样可以更轻松地在运行时管理对视图层次结构的更改。

    iOS 版本检测

    如果不是您想要检测的屏幕尺寸,而是用户正在运行的 iOS 版本,Apple 建议检查特定功能并在不可用时使用回退。同样,摘自 iOS App Programming Guide:

    • 要确定某个方法在现有类上是否可用,请使用 instancesRespondToSelector: 类方法或 respondsToSelector: 实例方法。

    • 链接到 iOS SDK 4.2 及更高版本的应用程序可以使用该版本 SDK 中引入的弱链接支持。这种支持让您可以检查给定的 Class 对象是否存在,以确定您是否可以使用该类。

    • 链接到 iOS SDK 4.1 和更早版本的应用程序必须使用 NSClassFromString 函数来查看是否定义了一个类。如果函数返回的值不是 nil,则可以使用该类。

    • 要确定基于 C 的函数是否可用,请执行函数名称与 NULL 的布尔比较。如果符号不为NULL,则可以使用该函数。

    最后,yasirmturk 提​​供了一系列方便的宏here 用于检查用户正在运行的 iOS 版本。

    【讨论】:

      【解决方案3】:

      这就是我的工作:

      if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
          // iPad
      } else {
          if (CGRectGetHeight([UIScreen mainScreen].bounds) >= 568.0) {
              // 4 inch - iPhone 5 or the new iPod touch
          }
          else {
              // 3,5 inch - iPhone 4S and older
          }
      }
      

      【讨论】:

      • 您也可以拨打[UIScreen mainScreen].scale判断设备是否为视网膜显示器,提供更多设备类型。
      • @c.cam108 是的,但这适用于 iPhone 4/4S、iPhone 5 和 iPad。我的代码用于区分它们。
      【解决方案4】:

      我在 UIDevice 上创建了一个类别来实现这一点。非常简单的实现,但代码是

      .h

      #import <UIKit/UIKit.h>
      
      @interface UIDevice (Recognition)
      
      - (BOOL)isDeviceiPhone5;
      
      @end
      

      .m #import "UIDevice+Recognition.h"

      @implementation UIDevice (Recognition)
      
      - (BOOL)isDeviceiPhone5
      {
          return ([UIScreen mainScreen].bounds.size.height == 568.0f);
      }
      
      @end
      

      然后你可以在任何地方做[[UIDevice currentDevice] isDeviceiPhone5]

      【讨论】:

      • 你为什么不这样做:return [UIScreen mainScreen].bounds.size.height == 568.0f;?
      • 这是我从学编程开始就养成的不良编码习惯。
      猜你喜欢
      • 2012-03-05
      • 2012-05-12
      • 2016-02-03
      • 2023-03-27
      • 1970-01-01
      • 2018-09-03
      • 2011-10-24
      • 2011-09-07
      • 2012-11-20
      相关资源
      最近更新 更多