我正在尝试检测当前设备是iPhone 5、iPhone 6还是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宏在任何方向上都能按预期工作。
我的问题是,当设备保持在LANDSCAPE中时,is_IPHONE_6和is_IPHONE _6_PLUS宏不会返回true。然而,当设备被放在PORTRAIT中时,它们确实按预期工作。什么东西?
此外,如果有人有更好的建议来检测iPhone 5、6和6 Plus,请分享。
这是针对iOS系统版本和SDK版本的任何组合进行测试和设计的
#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
不要使用屏幕大小,最好使用硬件型号。我们每年都会得到越来越多的屏幕尺寸,你在代码中硬编码的屏幕尺寸越少,对你未来的自己就越好。
您需要一个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版本。。。
看看这个答案:iOS-如何获得设备制造商和型号?它不使用宏,但它能完成任务。我在检测iPhone 6和iPhone 6 plus的宏中看到了一些类似的问题。因此,最好试试@Ohhmee 的答案
编辑:当然可能有一个用宏检测它的解决方案。但我不知道,我也找不到解决方案,所以我建议采取不同的方法。
您的宏非常荒谬,似乎表明了对浮点运算的恐惧。
#define IS_IPHONE_5 ([UIScreen mainScreen].bounds.size.height == 568)
#define IS_IPHONE_6 ([UIScreen mainScreen].bounds.size.height == 667)
#define IS_IPHONE_6_PLUS ([UIScreen mainScreen].bounds.size.height == 736)
会起到同样好(或同样坏)的作用。它们很可能也会同样糟糕。
如果你对iPhone 6或6+的功能感兴趣,请查看功能,而不是屏幕大小。苹果很可能很快就会有一款4英寸的手机,具有iPhone 6的所有功能。或者是一款价格便宜的6c大屏幕手机,但没有iPhone 6的功能。
对于用户界面等,只需使用mainScreen边界并相应地布置视图即可。在这一点上,固定大小的硬编码是绝对荒谬的,会咬你一口。例如,你应该能够在一台12英寸的分屏iPad上毫无问题地运行,天知道屏幕大小