以编程方式检测iPad / iPhone硬件的最佳方法

我需要找出的原因是,在iPad上,UIPickerView在横向上的高度与在纵向上的高度相同。 在iPhone上是不同的。 iPad编程指南为UIDevice引入了一个“成语”值:

UIDevice* thisDevice = [UIDevice currentDevice]; if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) { // iPad } else { // iPhone } 

当你在iPad(3.2)而不是iPhone(3.1.3)时工作正常 – 所以它看起来像还需要一个ifdef条件编译检查,如:

 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 UIDevice* thisDevice = [UIDevice currentDevice]; if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) { // etc. } #endif 

对我来说,这看起来非常笨拙。 什么是更好的方法?

我现在正在回答这个问题(因为现在的答案很晚),因为很多现有的答案都是比较陈旧的,根据Apples最新的文档(iOS 8.1,2015),最多的投票答案似乎是错误的!

为了certificate我的观点,这是来自苹果头文件的评论(总是看苹果的源头和头文件):

 /*The UI_USER_INTERFACE_IDIOM() macro is provided for use when deploying to a version of the iOS less than 3.2. If the earliest version of iPhone/iOS that you will be deploying for is 3.2 or greater, you may use -[UIDevice userInterfaceIdiom] directly.*/ 

因此,目前APPLE推荐的方式来检测iPhone与iPad,如下:

1)在iOS PRIOR到3.2的版本上,使用Apple提供的macros:

 // for iPhone use UIUserInterfaceIdiomPhone if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

2)在iOS 3.2或更高版本的版本上,使用[UIDevice currentDevice]上的属性:

 // for iPhone use UIUserInterfaceIdiomPhone if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) 

在运行时检查(第一种方式)在编译时与#if完全不同。 预处理器指令不会给你一个通用的应用程序。

首选的方法是使用苹果的macros:

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { // The device is an iPad running iPhone 3.2 or later. } else { // The device is an iPhone or iPod touch. } 

使用3.2作为基本的SDK(因为macros3.2没有定义),你可以定位到以前的操作系统版本,让它在iPhone上运行。

我喜欢我的isPad()函数。 相同的代码,但保持在视线之外,只在一个地方。

我的解决scheme(适用于3.2+):

 #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

然后,

 if (IS_IPAD) // do something 

要么

 if (IS_IPHONE) // do something else 

把这个方法放到你的App Delegate中,这样你可以在任何地方用[[[[UIApplication sharedApplication] delegate] isPad]

 -(BOOL)isPad { BOOL isPad; NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"]; if(range.location==NSNotFound) { isPad=NO; } else { isPad=YES; } return isPad; } 

如果您使用的function不是向后兼容的,我发现最好的方法是在预编译的头文件中创build一个#define。 例:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2 #define USING_4_X #endif 

然后在你的代码中,你可以这样做:

 BOOL exists = NO; #ifdef USING_4_X exists = [SomeObject someMethod:[url lastPathComponent]]; #else exists = [SomeObject someMethod:[[url path] lastPathComponent]]; #endif 

如果1-您已经将应用程序安装到您的设备中,则可以将其构build设置更改为“通用”应用程序,3-将应用程序安装到预先存在的应用程序的顶部(不删除以前的应用程序)

您可能会发现此处提供的用于检测iPhone / iPad的解决scheme不起作用。 首先,删除iPad“iPhone”的应用程序,并将其安装到您的设备上。

 BOOL isIpad() { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return YES; } return NO; }