以编程方式检测 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
对我来说,这开始看起来非常笨拙。有什么更好的办法呢?
The reason I need to find out is that on an iPad, a UIPickerView has the same height in landscape orientation as it does in portrait. On an iPhone it is different. The iPad programming guide introduces an "idiom" value to UIDevice:
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// iPad
}
else
{
// iPhone
}
which works OK while you're in iPad (3.2) but not iPhone (3.1.3) - so it looks like there also needs to be an ifdef to conditionally compile that check, like:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// etc.
}
#endif
To me that's starting to look very clumsy. What's a better way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
在运行时检查(第一种方法)与编译时的 #if 完全不同。预处理器指令不会为您提供通用应用程序。
首选方法是使用 Apple 的宏:
使用 3.2 作为基础 SDK(因为宏在 3.2 之前没有定义),您可以定位之前的操作系统版本以使其在 iPhone 上运行。
Checking at runtime (your first way) is completely different from #if at compile time. The preprocessor directives won't give you a universal app.
The preferred way is to use Apple's Macro:
Use 3.2 as the base SDK (because the macro is not defined pre 3.2), you can target prior OS versions to get it running on the iPhone.
我现在(而且这么晚)回答这个问题,因为许多现有的答案都相当旧了,而且根据苹果当前的文档(iOS 8.1,2015),最多投票的答案实际上似乎是错误的!
为了证明我的观点,这是 Apple 头文件中的注释(始终查看 Apple 源代码和标头):
因此,目前 APPLE 推荐 检测 iPhone 与 iPad 的方法如下:
1 ) (从 iOS 13 开始已弃用) 在 iOS 3.2 之前的版本上,使用 Apple 提供的宏:
2) 在 iOS 3.2 或更高版本上,使用该属性[UIDevice当前设备]:
I'm answering this now (and at this late date) because many of the existing answers are quite old, and the most Up Voted actually appears to be wrong according to Apples current docs (iOS 8.1, 2015)!
To prove my point, this is the comment from Apples header file (always look at the Apple source and headers):
Therefore, the currently APPLE recommended way to detect iPhone vs. iPad, is as follows:
1) (DEPRECATED as of iOS 13) On versions of iOS PRIOR to 3.2, use the Apple provided macro:
2) On versions of iOS 3.2 or later, use the property on [UIDevice currentDevice]:
我喜欢我的 isPad() 函数。相同的代码,但将其放在看不见的地方,并且只放在一处。
I like my isPad() function. Same code but keep it out of sight and in only one place.
我的解决方案(适用于 3.2+):
然后,
或者
My solution (works on 3.2+):
then,
or
在 Swift 中,使用 userInterfaceIdiom 实例属性作为-
&对于其他设备 -
In Swift use userInterfaceIdiom instance property as-
& For other devices -
用法:
Usage:
将此方法放入您的 App Delegate 中,以便您可以使用 [[[UIApplication sharedApplication] delegate] isPad] 在任何地方调用它
Put this method in your App Delegate so that you can call it anywhere using [[[UIApplication sharedApplication] delegate] isPad]
如果您使用的功能不向后兼容,我发现对我来说最好的方法是在预编译头中创建#define。示例:
然后在您的代码中,您可以执行以下操作:
If you are using features that are not backwards compatible, I found the best way for me is to create a #define in the pre-compiled header. Example:
Then in your code, you can do this:
如果
1-您已经将应用程序安装到您的设备中,
2-您将其构建设置更改为“通用”应用程序,
3- 将应用程序安装到您的设备上现有的应用程序之上(不删除前一个应用程序)
您可能会发现此处提供的用于检测 iPhone/iPad 的解决方案不起作用。首先,删除“仅”适用于 iPad/iPhone 的应用程序并将其重新安装到您的设备上。
If
1- you already have the app installed into your device,
2- you change its build settings to be a 'Universal' app,
3- install the app to your device on top of the pre-existing app (without deleting the previous one)
You might find that the solutions provided here to detect iPhone/iPad do not work. First, delete the app that was 'only' for iPad/iPhone and install it fresh to your device.