【发布时间】:2013-03-13 16:39:56
【问题描述】:
我需要一个宏来确定设备是 iPhone 4 还是 iPhone 5。有人告诉我有一个宏可以做到这一点。有谁知道它是什么或我在哪里可以找到它?
【问题讨论】:
-
你不能使用宏,你需要在运行时检查
标签: ios objective-c macros c-preprocessor
我需要一个宏来确定设备是 iPhone 4 还是 iPhone 5。有人告诉我有一个宏可以做到这一点。有谁知道它是什么或我在哪里可以找到它?
【问题讨论】:
标签: ios objective-c macros c-preprocessor
我找到了一个可以解决问题的方法
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double) 568) < DBL_EPSILON)
【讨论】:
不幸的是,不仅没有宏,甚至没有返回设备类型的公共 API 调用,它可以区分不同版本的 iPhone(例如 iPhone 4 和 iPhone5)。
您可以使用UI_USER_INTERFACE_IDIOM 宏来确定用户是在 iPhone/iPod 还是 iPad 上运行:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// The device is an iPad running iOS 3.2 or later.
}
else {
// The device is an iPhone or iPod touch.
}
取自iOS App Programming Guide的'Advanced App Tricks部分。
关于普遍支持多种屏幕尺寸和 iPhone 4 和 iPhone 5,iOS App Programming Guide 指出:
要在您的代码中正确支持更大的屏幕,切勿对当前设备的屏幕尺寸做出假设。相反,始终动态检索屏幕、窗口或视图的大小,并使用该大小信息来配置您的界面。您还应该使用基于视图的约束来构建用户界面,这样可以更轻松地在运行时管理对视图层次结构的更改。
如果不是您想要检测的屏幕尺寸,而是用户正在运行的 iOS 版本,Apple 建议检查特定功能并在不可用时使用回退。同样,摘自 iOS App Programming Guide:
要确定某个方法在现有类上是否可用,请使用 instancesRespondToSelector: 类方法或 respondsToSelector: 实例方法。
链接到 iOS SDK 4.2 及更高版本的应用程序可以使用该版本 SDK 中引入的弱链接支持。这种支持让您可以检查给定的 Class 对象是否存在,以确定您是否可以使用该类。
链接到 iOS SDK 4.1 和更早版本的应用程序必须使用 NSClassFromString 函数来查看是否定义了一个类。如果函数返回的值不是 nil,则可以使用该类。
要确定基于 C 的函数是否可用,请执行函数名称与 NULL 的布尔比较。如果符号不为NULL,则可以使用该函数。
最后,yasirmturk 提供了一系列方便的宏here 用于检查用户正在运行的 iOS 版本。
【讨论】:
这就是我的工作:
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
} else {
if (CGRectGetHeight([UIScreen mainScreen].bounds) >= 568.0) {
// 4 inch - iPhone 5 or the new iPod touch
}
else {
// 3,5 inch - iPhone 4S and older
}
}
【讨论】:
[UIScreen mainScreen].scale判断设备是否为视网膜显示器,提供更多设备类型。
我在 UIDevice 上创建了一个类别来实现这一点。非常简单的实现,但代码是
.h
#import <UIKit/UIKit.h>
@interface UIDevice (Recognition)
- (BOOL)isDeviceiPhone5;
@end
.m #import "UIDevice+Recognition.h"
@implementation UIDevice (Recognition)
- (BOOL)isDeviceiPhone5
{
return ([UIScreen mainScreen].bounds.size.height == 568.0f);
}
@end
然后你可以在任何地方做[[UIDevice currentDevice] isDeviceiPhone5]
【讨论】:
return [UIScreen mainScreen].bounds.size.height == 568.0f;?