【问题标题】:#ifdef to check if device is iPhone 5#ifdef 检查设备是否为 iPhone 5
【发布时间】:2012-11-03 13:23:27
【问题描述】:

我写道:

#define IS_IPHONE_5 ([UIScreen mainScreen].bounds.size.height == 568.0)

#ifdef IS_IPHONE_5
#define SCREEN_HEIGHT 568
#else
#define SCREEN_HEIGHT 480
#endif

但它总是返回那个设备是 iPhone 5...我做错了什么?

【问题讨论】:

标签: iphone if-statement height preprocessor


【解决方案1】:

您的IS_IPHONE_5 宏很好。你可以这样做:

if (IS_IPHONE_5) {
    // do something specific for iPhone 5
}

在编译时,此代码将转换为:

if (([UIScreen mainScreen].bounds.size.height == 568.0)) {
}

问题在于您的 SCREEN_HEIGHT 宏。整个#ifdef 块将在编译时进行评估。由于您确实定义了IS_IPHONE_5,因此SCREEN_HEIGHT 将始终设置为568。

您希望在运行时确定屏幕高度。你可以从:

[UIScreen mainScreen].bounds.size.height

【讨论】:

    【解决方案2】:

    屏幕高度检查必须在运行时完成。 #ifdef IS_IPHONE_5 不会在运行时评估,而是在预编译时评估。您可以将屏幕高度代码作为类的运行时方法的一部分来调用。

    你可以做类似的事情

    - (BOOL) isIphone5
    {
        return ([UIScreen mainScreen].bounds.size.height == 568.0);
    }
    

    或者像下面所说的那样

    【讨论】:

    • 我可以使用其他预处理器语句来检查设备是否是 iPhone 5 吗?
    • IS_IPHONE_5 宏很好。问题在于 SCREEN_HEIGHT 宏。
    • 不,预处理器指令在源代码编译之前处理 - 因此无法确定您的应用程序在哪个手机上运行。因此,您必须按照此回答者建议的方式检查手机。
    • @FergusMorrow #define 按原样就好。在编译时,它的使用将被宏的定义所取代。所以最终生成的代码实际上会对 iPhone 5 屏幕的高度进行有效的运行时检查。
    • maddy - 你是对的,基本上我的意思是屏幕高度检查必须在运行时完成,使用那个宏就可以了,虽然在运行时。
    【解决方案3】:

    任何以# 开头的指令都由预处理器处理;所以在应用程序被编译之前。

    现在您需要在定义中执行运行时代码;特别是-[UIScreen mainScreen].bounds.size.height。显然,当应用程序尚未编译时,这不会执行!

    在大多数使用#ifdef 指令的桌面应用程序中,这是因为预处理器在编译时根据通常位于主机源文件中的#define 语句对其进行评估。 (也就是说,我将在 Mac OS X 机器上编译 Mac OS X 的代码,因此预处理器会在别处找到 #define 语句以允许它识别它的平台)

    对于您正在查看的内容,您必须在应用实际在设备上运行时检测屏幕尺寸;不在编译时间之前 - 因为在编译之后它可以在任何设备上运行。

    底线是预处理器条件语句仅在编译时是有条件的——一旦应用程序被编译,它们就不能改变执行;它们变成“静态”,就像您正在编译的任何其他代码一样。

    【讨论】:

    • 很抱歉,#define 可以按原样使用。请参阅我的答案以了解原因。
    • 是的 #define 是 - 但不是在用于条件预处理器语句时。整个#ifdef/#ifndef 想法不会起作用,因为它是在编译之前评估的,而不是在运行时评估的。这就是问题所在。否则会完全混淆问题 - 正如我在帖子中明确指出的那样,预处理器 条件语句 仅在编译时是有条件的;不是定义 - 而是实际的条件语句。
    • 对,看我的回答。我解释了这一点。
    • 我知道您来自哪里,我并不是说#define 有什么问题 - 只是使用预处理器条件语句。我们似乎都同意..
    【解决方案4】:

    试试这个定义

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

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2016-03-08
      相关资源
      最近更新 更多