【问题标题】:Is there a specific Xcode compiler flag that gets set when compiling for iPad?为 iPad 编译时是否设置了特定的 Xcode 编译器标志?
【发布时间】:2010-01-29 04:54:14
【问题描述】:

在为 iPad 编译时是否设置了特定的 Xcode 编译器标志?

我想有条件地编译 iPad vs iPhone/iPod Touch 代码,例如:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

我知道 TargetConditionals.h 中已经有 TARGET_OS_IPHONE 和 TARGET_CPU_ARM,但是有什么容易和专门针对 iPad 的吗?

-雷

【问题讨论】:

  • 我也有同样的问题。你有没有其他解决方案可以做和你的问题一样的事情。我想做的一模一样,但显示错误“找不到符号”帮助我做到这一点..

标签: ipad iphone-sdk-3.2


【解决方案1】:

用于运行时检查 iPad 与 iPhone/iPad Touch 的正确 API 是:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

UIDevice 头文件还包括一个方便的宏 UI_USER_INTERFACE_IDIOM(),如果您的部署目标是

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

所以你可以消极地说:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);

【讨论】:

    【解决方案2】:

    您应该使用运行时检查,而不是使用编译时标志,例如使用NSClassFromString 来查看一个类是否存在,因为可以在两个设备上安装同一个应用程序。

    并且由于可以在两种设备上运行该应用程序,因此没有内置的编译时检查它是否针对 iPad。

    【讨论】:

    • 肯尼是正确的。 Apple 建议运行时检查 API 和针对新框架的弱链接等。您可以使用 Erica Sadun 的 UIDevice Extensions (github.com/erica/uidevice-extension),轻松检查您在运行时运行的设备。正如 Kenny 所说,NSClassFromString、responsToSelector 和检查函数名是否为 NULL 是你的朋友。
    【解决方案3】:

    目前我没有找到任何可以让你检查你是否在 iPad 上的东西,但我也不确定 Apple 是否推荐运行时检查。以下是 Apple 的摘录:

    除了您的视图控制器之外,任何在 iPhone 和 iPad 设备之间共享的类都需要包含条件编译宏以隔离特定于设备的代码。尽管您还可以使用运行时检查来确定特定的类或方法是否可用,但这样做只会增加可执行文件的大小,因为它会添加不会在一台设备或另一台设备上遵循的代码路径。让编译器删除此代码有助于保持代码更简洁。

    但是,我找不到更多关于条件编译宏的具体信息。

    【讨论】:

    • 是的,我也读过这个,所以我想在某个地方会有一些#define,但我找不到。现在,我正在使用 UIScreen 尺寸检查是否在 iPad 上,但这似乎不是很优雅。我将看看上面提到的 UIDevice-extension。谢谢大家! -Rei
    【解决方案4】:

    对于共享同一项目/代码的多个目标,我通过编辑我的 iPad 目标的 C 标志来做到这一点。

    选择 [myapp]-iPad 目标作为活动目标,选择项目 -> 编辑活动目标 [myapp]-iPad。搜索“c flags”并双击。为“-D TARGET_IPAD”添加一个标志。现在符号 TARGET_IPAD 将只为您的 iPad 目标定义。

    当然,这仅在您为 iPad 和 iPhone 使用单独的目标时才有效。如果您在两者上运行相同的二进制文件,显然编译器无法为您做任何事情。 (但是,截至 1 月底的 3.2 SDK 甚至还不支持通用应用程序。)

    (已编辑;我对“通用”应用等术语感到困惑。)

    【讨论】:

    • 那你是说苹果口中的那个神秘的通用应用还不存在?有趣的是,如果我们需要有两个不同的构建,那就是提交到应用商店的两个不同版本。苹果说这不是他们想要的。我在等着看结果如何。
    • 3.REDACTED SDK 的发行说明说尚不支持构建 UnivREDACTEDal 应用程序。我敢打赌它很快就会到来。
    【解决方案5】:

    或者 -> 只是为了确定

    -(BOOL)isDeviceAniPad
    {   
    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
     BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
     return deviceIsPad;
    #endif
     return NO;
    }
    

    【讨论】:

    • 只要使用UI_USER_INTERFACE_IDIOM()
    【解决方案6】:

    我觉得这样就可以了

    -(BOOL)isDeviceAniPad
    {   
    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
      return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
    #endif
      return NO;
    }
    

    【讨论】:

    • 只要使用UI_USER_INTERFACE_IDIOM()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多