我是否可以使用#if
或#ifdef
检查构建预处理器宏,以确定我当前的Xcode项目是否针对iPhone或iPad构建?
修改
正如几个答案所指出的,通常应用程序是通用的,并且相同的二进制文件可以在两个设备上运行。这些非常相似的设备之间的条件行为应该在运行时而不是编译时解决。
答案 0 :(得分:25)
本博客评论部分的一些想法
http://greensopinion.blogspot.com/2010/04/from-iphone-to-ipad-creating-universal.html
主要使用
UI_USER_INTERFACE_IDIOM()
如:
#ifdef UI_USER_INTERFACE_IDIOM()
#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD() (false)
#endif
答案 1 :(得分:9)
NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"]) {
//iPhone
}
else if([deviceType isEqualToString:@"iPod touch"]) {
//iPod Touch
}
else {
//iPad
}
就我而言,您不能使用#if或#ifdef来执行此操作,但是,它受支持,因为Obj-C是C的严格超集。
答案 2 :(得分:8)
无法确定您的应用是针对iPhone还是iPad构建的。预处理器#if
指令在构建期间得到解决。构建应用程序并将其标记为通用后,必须在两台设备上正确运行。在构建期间,没有人知道稍后将安装它的位置,并且可以在两者上安装一个构建。
但您可能需要执行以下操作之一:
在运行时检测设备型号 。
要执行此操作,请使用[[UIDevice currentDevice] model]
并与iPhone
,iPod touch
或iPad
字符串进行比较。即使在iPad上以兼容模式运行(仅适用于iPhone的应用程序),这也会返回正确的设备。这对于使用情况分析非常有用。
在运行时检测用户界面习语 。
这是每个人在为iPhone和iPad提供不同内容时所检查的内容。使用[[UIDevice currentDevice] userInterfaceIdiom]
并与UIUserInterfaceIdiomPhone
或UIUserInterfaceIdiomPad
进行比较。您可能想要制作这样的便利方法:
@implementation UIDevice (UserInterfaceIdiom)
- (BOOL)iPhone {
return (self.userInterfaceIdiom == UIUserInterfaceIdiomPhone);
}
+ (BOOL)iPhone {
return [[UIDevice currentDevice] iPhone];
}
- (BOOL)iPad {
return (self.userInterfaceIdiom == UIUserInterfaceIdiomPad);
}
+ (BOOL)iPad {
return [[UIDevice currentDevice] iPad];
}
@end
然后你可以使用:
if ([[UIDevice currentDevice] iPhone]) { }
// or
if ([UIDevice iPhone]) { }
// or
if (UIDevice.iPhone) { }
答案 3 :(得分:0)
swift的更新:
无法使用预处理器。使全局功能为
func IS_IPAD() -> Bool {
( return (UIDevice.respondsToSelector(Selector("userInterfaceIdiom"))) && (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad) )}