我需要一个宏来确定设备是 iPhone 4 还是 iPhone 5。有人告诉我有一个宏可以做到这一点。有谁知道它是什么或我在哪里可以找到它?
4 回答
我找到了一个可以解决问题的
#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版本检测
如果不是您想要检测的屏幕尺寸,而是用户正在运行的 iOS 版本,Apple 建议检查特定功能并在不可用时使用回退。同样,取自 iOS App Programming Guide:
要确定现有类上的方法是否可用,请使用 instancesRespondToSelector: 类方法或 respondsToSelector: 实例方法。
链接到 iOS SDK 4.2 及更高版本的应用程序可以使用该版本 SDK 中引入的弱链接支持。此支持允许您检查给定 Class 对象的存在以确定您是否可以使用该类。
链接到 iOS SDK 4.1 和更早版本的应用程序必须使用 NSClassFromString 函数来查看是否定义了一个类。如果函数返回 nil 以外的值,则可以使用该类。
要确定基于 C 的函数是否可用,请执行函数名称与 NULL 的布尔比较。如果符号不为 NULL,则可以使用该函数。
最后,yasirmturk在这里提供了一系列方便的宏,用于检查用户正在运行的 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
}
}
我在 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]