是否有用于在运行时检查您是在iPhone还是iPad上运行的API?
我能想到的一种方法是使用:
[[UIDevice currentDevice] model];
并检测字符串@“iPad”的存在 - 这看起来有点脆弱。
在3.2 SDK中,我看到UIDevice
也有一个我正在寻找的属性,但不适用于3.2之前(显然):
[[UIDevice currentDevice] userInterfaceIdiom];
除了检查通用应用程序是否存在@“iPad”之外还有其他方法吗?
答案 0 :(得分:41)
返回当前设备支持的接口习惯用法。
返回值
如果设备是iPhone或iPod touch,则UIUserInterfaceIdiomPhone
;如果设备是iPad,则为UIUserInterfaceIdiomPad
。应在当前设备上使用的接口类型
typedef enum {
UIUserInterfaceIdiomPhone,
UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
答案 1 :(得分:15)
仅供我参考:
@property (nonatomic, readonly) BOOL isPhone;
-(BOOL)isPhone {
return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}
或使用#define
#define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
但是,如果您在代码中使用isPhone
,那通常就是不好的做法。使用工厂模式和多态来保存您的if
语句,这样您就可以获得为手机或iPad创建的对象,然后使用它们。
<强>加强>
我现在在我的代码中使用此解决方案。它将标准工厂模式添加到alloc。
#define ALLOC_PER_DEVICE() id retVal = nil; \
NSString *className = NSStringFromClass(self);\
if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
className = [NSString stringWithFormat:@"%@Phone", className];\
Class newClass = NSClassFromString(className);\
retVal = [newClass alloc];\
}\
if (!retVal)\
retVal = [super alloc];\
assert(retVal != nil);\
return retVal\
然后我的allocs看起来像这样:
+alloc { ALLOC_PER_DEVICE(); }
我为手机版添加了一个名为TheClassPhone
的子类。
注意:由于Objective-C中没有多重继承,因此使用继承来解决您的问题有点过高(即,如果您有子类的子类,它就不起作用)。
。当你需要它时,没有什么比好if
更好。
答案 2 :(得分:1)
编辑: ...这显然正是UI_USER_INTERFACE_IDIOM()宏所做的,所以请改用它。 :)
答案 3 :(得分:1)
您可以使用以下代码检查您是否在iPhone或iPad上运行该应用程序:
- (NSString *)deviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
- (NSString *) platformString
{
NSString *platform = [self deviceModel];
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G";
else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G";
else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS";
else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4";
else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4";
else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S";
else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPod1,1"]) return @"iPod_Touch 1G";
else if ([platform isEqualToString:@"iPod2,1"]) return @"iPod_Touch 2G";
else if ([platform isEqualToString:@"iPod3,1"]) return @"iPod_Touch 3G";
else if ([platform isEqualToString:@"iPod4,1"]) return @"iPod_Touch 4G";
else if ([platform isEqualToString:@"iPad1,1"]) return @"iPad_1G";
else if ([platform isEqualToString:@"iPad2,1"]) return @"iPad_2(WiFi)";
else if ([platform isEqualToString:@"iPad2,2"]) return @"iPad_2(GSM)";
else if ([platform isEqualToString:@"iPad2,3"]) return @"iPad_2(CDMA)";
else if ([platform isEqualToString:@"iPad3,1"]) return @"iPad_3";
else if ([platform isEqualToString:@"iPad3,2"]) return @"iPad_3(GSM/CDMA)";
else if ([platform isEqualToString:@"iPad3,3"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad3,4"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad2,5"]) return @"iPad_mini_1G";
else if ([platform isEqualToString:@"i386"]) return @"Simulator";
else if ([platform isEqualToString:@"x86_64"]) return @"Simulator";
return platform;
}
答案 4 :(得分:0)