【问题标题】:iPhone - How to use #define in Universal appiPhone - 如何在通用应用程序中使用#define
【发布时间】:2010-12-27 16:52:28
【问题描述】:

我正在创建在 iPhone 和 ipad 上运行的通用应用程序。 我正在使用#define 创建 CGRect。我想使用两种不同的#define - 一种用于 iPhone,一种用于 iPad。 我该如何声明它们,以便通用应用程序选择正确的一个............

我想我必须更新一点描述以避免混淆。 我有一个 WPConstants.h 文件,我在其中声明所有 #define 如下

#define PUZZLE_TOPVIEW_RECT CGRectMake(0, 0, 480, 100)
#define PUZZLE_MIDDLEVIEW_RECT CGRectMake(0, 100, 480, 100)
#define PUZZLE_BOTTOMVIEW_RECT CGRectMake(0, 200, 480, 100)

以上是针对iphone的。同样对于 iPad,我想要不同的#define 我该如何继续?

【问题讨论】:

    标签: iphone universal-binary


    【解决方案1】:

    按照 Apple 的建议,使用

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { ... }
    else { ... }
    

    编写特定于平台的代码。使用三元 ?: 运算符,您还可以将其合并到 #define 中:

    #define MyRect (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? CGRectMake(0,0,1024,768) : CGRectMake(0,0,480,320))
    

    如果您想使用条件编译来确定代码中应包含两个 #define 语句中的哪一个,则不能:通用应用程序不包含用于 iPhone 和 iPad 的两个单独的二进制文件。它只是一个二进制文件,因此所有与平台相关的决策都必须在运行时做出。

    【讨论】:

    • 感谢您的信息。您仅针对一个矩形提到了 CGRectMake。请查看我的更新说明。
    • 好吧,你显然会重复这个过程三遍。顺便说一句,我不会与#defines 合作。为什么不直接声明一个变量并根据您运行的平台定义它。
    • 再次感谢。你能告诉我如何在我运行的平台上声明变量帐户吗?
    • 只要声明一个变量:CGRect puzzleTopViewRect;,然后根据UI_USER_INTERFACE_IDIOM()的结果设置它的值。
    【解决方案2】:

    我使用这个函数来检测 iPad,然后为我的应用程序的所有不同部分编写条件。

    #ifdef UI_USER_INTERFACE_IDIOM
        #define isPad() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #else
        #define isPad() NO
    #endif
    

    您还可以为 iPhone/iPad 加载不同的 xib 文件。

    【讨论】:

    • #ifdef UI_USER_INTERFACE_IDIOM 在 Xcode 6.3+ 中被破坏,因为它不再是预处理器定义
    猜你喜欢
    • 2013-10-05
    • 2011-05-19
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多