我正在尝试检测当前设备是iPhone5、iPhone6还是iPhone 6 Plus。
在我的应用程序中,我已经在使用这个宏来检测iPhone 5了,它工作得很好。
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)类似地,我使用这个宏来检测iPhone 6和iPhone 6 Plus。
#define IS_IPHONE_6 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)IS_IPHONE_5宏在任何方向上都能按预期工作。
我的问题是,当设备处于横向放置状态时,IS_IPHONE_6和IS_IPHONE_6_PLUS宏不会返回true。然而,当设备保持在肖像中时,它们确实如预期的那样工作。怎么回事?
此外,如果任何人有更好的建议来检测iPhone5,6和6Plus请分享。
发布于 2014-11-02 16:19:51
这是针对iOS系统版本和软件开发工具包版本的任意组合进行测试和设计的
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)注意:如果iPhone 6处于缩放模式,则UI是iPhone 5的放大版本。这反映在宏中。
用法:http://pastie.org/9687735
发布于 2014-10-02 17:25:23
不要使用屏幕尺寸,最好使用硬件型号。我们每年都会得到越来越多的屏幕尺寸,你在代码中硬编码屏幕尺寸越少,对你未来的自己就越好。
您需要一个helper函数来获取机器名称。我使用dispatch_once来避免多次向系统查询不会更改的数据。
NSString* machineName()
{
static NSString* name = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
struct utsname systemInfo;
uname(&systemInfo);
name = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
});
return name;
}然后根据需要定义几个宏:
#define IS_IPHONE_6 [machineName() isEqualToString:@"iPhone7,2"]
#define IS_IPHONE_6_PLUS [machineName() isEqualToString:@"iPhone7,1"]对于某些型号来说更加棘手:
#define IS_IPHONE_5s [machineName() hasPrefix:@"iPhone6,"]最后,在代码中使用宏:
if (IS_IPHONE_6) {
// for the 6
}注意:这回答了你的问题(用宏检测模型),但是你做错了。你应该使用自动布局和大小类,除非你支持非常老的iOS版本...
发布于 2014-10-02 02:27:07
看看这个答案:iOS - How to get device make and model?,它不使用宏,但它可以完成工作。我在用于检测iPhone 6和iPhone 6 plus的宏中看到了一些类似的问题。所以尝试一下@Ohhmee的答案会更好
编辑:当然,可能有一种解决方案可以用宏来检测它。但我不知道这一点,也找不到解决方案,所以我建议使用一种不同的方法。
https://stackoverflow.com/questions/26147913
复制相似问题