【问题标题】:#define based upon platform [iPhone or iPad]#define 基于平台 [iPhone 或 iPad]
【发布时间】:2011-08-30 03:34:44
【问题描述】:

我正在尝试使我的 iPhone 应用程序与 iPad 兼容。 在头文件中,我设置了一些常量。 由于屏幕更大,我希望在 iPad 上用于图像的一些常量比在 iPhone 上更大。 我在互联网上找到了一些建议来实现这一点:

#if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define imgAmcWidth 656.0f
#define imgAmcHeight 36.0f
#else
#define imgAmcWidth    240.0f
#define imgAmcHeight   20.0f
#endif

这似乎满足了我的需求。 不幸的是,xcode 4 无法编译它并给出错误:'Token "[" is not valid in preprocessor..' [LLVM GCC 4.2]。 我做错了什么?

【问题讨论】:

    标签: ios objective-c iphone c-preprocessor universal-code


    【解决方案1】:

    UI_USER_INTERFACE_IDIOMUIUserInterfaceIdiomPad 不是预处理器。它们是 iOS 的一部分,所以你应该这样做:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        <define your constants here>
    } else {
        <define your constants here>
    }
    

    如果您计划支持 3.2 之前的 iOS 版本,另请参阅 this

    【讨论】:

    • 谢谢——我就是这么想的。但是这种方法不允许在类之间共享常量吗?
    【解决方案2】:

    虽然可能不是最优雅的解决方案,但为了防止对代码进行重大重写,我决定使用以下技巧:

    #define iPad    UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
    #define imgAmcWidth         (iPad ? 639.0f : 240.0f)
    // etc..
    

    【讨论】:

    • 您应该在宏定义周围加上括号,否则您可能会遇到奇怪的优先级或操作数不匹配错误。括号使您的宏在更多上下文中使用“安全”。
    • 如果这个方法被用于被大量引用的常量,它会降低应用程序的速度。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多