13

为 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 的吗?

-Rei

4

6 回答 6

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);
于 2010-03-22T20:33:45.227 回答
2

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

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

于 2010-01-29T07:56:06.013 回答
0

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

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

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

于 2010-01-29T13:21:00.510 回答
0

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

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

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

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

于 2010-02-01T00:03:23.540 回答
0

或者->只是为了确定

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}
于 2010-06-09T12:26:27.517 回答
-1

我认为这会做

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
于 2010-04-21T06:33:28.120 回答