因为本公司的项目一直是竖屏,所以一开始的思路是根据屏幕上方的状态栏的高度进行判断,但最后考虑到手机开启WiFi共享、或者有地图类软件打开时上方会有蓝条,根据导航栏判断是否为刘海屏就不准确了。
所以说起来最准确的就是根据设备的型号进行判断,因为苹果不同设备的型号不同,而我们可以获取到设备的型号,所以根据型号进行判断是最准确的。
但这样判断还是有缺点的,就是如果苹果出了新的手机时,我们需要重新将刘海屏的设备型号添加进去。
还有一点就是在模拟器上,获取的设备型号是i386和x86_64,所以在模拟器中我们可以根据屏幕宽高或者屏幕下方安全区域进行判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| + (BOOL)isIphoneX{ struct utsname systemInfo; uname(&systemInfo); NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) { UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; // 获取底部安全区域高度,iPhone X 竖屏下为 34.0,横屏下为 21.0,其他类型设备都为 0 BOOL haveSafeInset; if (@available(iOS 11.0, *)) { CGFloat bottomSafeInset = keyWindow.safeAreaInsets.bottom; haveSafeInset = (bottomSafeInset == 34.0f || bottomSafeInset == 21.0f); }else{ haveSafeInset = NO; } return haveSafeInset; } BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"] || [platform isEqualToString:@"iPhone11,8"] || [platform isEqualToString:@"iPhone11,2"] || [platform isEqualToString:@"iPhone11,6"] || [platform isEqualToString:@"iPhone11,4"]; return isIPhoneX; }
|
关于设备的型号,我有大致写一下,不过具体的还是建议从苹果设备类型说明里面进行查看,然后当需要更新相应设备的时候可以直接在自己代码中添加。
参考资料: