在编译iPad时是否有一个特定的Xcode编译器标志?

时间:2010-01-29 04:54:14

标签: ipad iphone-sdk-3.2

在编译iPad时是否有一个特定的Xcode编译器标志?

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

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

我知道TargetConditionals.h中已经有TARGET_OS_IPHONE和TARGET_CPU_ARM,但是哪些东西都能轻松专门针对iPad?

-Rei

6 个答案:

答案 0 :(得分:16)

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

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

UIDevice头文件管理器还包括一个方便的宏UI_USER_INTERFACE_IDIOM(),如果您的部署目标是< iPhone 3.2。

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

所以你可以说,消极地说:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

  

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

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

答案 3 :(得分:0)

对于共享相同项目/代码的多个目标,我是通过编辑iPad目标的C标志来实现此目的。

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

当然,这只适用于iPad和iPhone使用单独的目标。如果你在两者上运行相同的二进制文件,显然编译器无法为你做什么。 (但是,截至1月底的3.2 SDK甚至还不支持通用应用程序。)

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

答案 4 :(得分:0)

或 - >只是为了确定

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

答案 5 :(得分:-1)

我认为这样做

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