截止目前,苹果全部刘海系列的设备屏幕数据以下:react
该系列设备导航栏高度88(64), 状态栏高度44(20), tabbar高度83(49), 其中括号中的为非刘海系列的高度。git
对于未进行新设备屏幕尺寸适配的工程,在新设备iPhone XS Max和iPhone XR上运行, 它们是以放大模式自动适配的(以iPhone X为基准等比例放大),此时在代码中获取的屏幕高度都是375pt * 812pt。github
针对这种状况,须要配置Assets.xcassets
里的 LaunchImage
,新增两种828px * 1792px
、1242px * 2688px
启动图便可。objective-c
对于比较新的以LaunchScreen.stroyboard
为启动页的,听说是直接从新编译工程便可。react-native
最后,对于刘海屏幕的判断,项目中使用了两种方式:iphone
根据屏幕宽高进行判断:编码
这是RN中用来判断的代码,使用nativeBounds
是因为它是一个跟屏幕朝向无关的数据,值恒等于屏幕portrait-up
方向时的宽高。spa
static BOOL RCTIsIPhoneX() { static BOOL isIPhoneX = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ CGSize screenSize = [UIScreen mainScreen].nativeBounds.size; CGSize iPhoneXScreenSize = CGSizeMake(1125, 2436); CGSize iPhoneXMaxScreenSize = CGSizeMake(1242, 2688); CGSize iPhoneXRScreenSize = CGSizeMake(828, 1792); isIPhoneX = CGSizeEqualToSize(screenSize, iPhoneXScreenSize) || CGSizeEqualToSize(screenSize, iPhoneXMaxScreenSize) || CGSizeEqualToSize(screenSize, iPhoneXRScreenSize); }); return isIPhoneX; }
经过获取设备的device model来判断:code
每一台iOS设备都有对应的硬件编码/标识符,称为device model
或者叫machine name
,代码以下blog
+ (NSString *)getMachine { //方法一: // static const char MachineName[] = "hw.machine"; // NSString* result = nil; // size_t size = 0; // if (sysctlbyname(MachineName, NULL, &size, NULL, 0) || size == 0) // return nil; // char *machine = new char[size]; // if (sysctlbyname(MachineName, machine, &size, NULL, 0) == 0) // result = [NSString stringWithUTF8String:machine]; // delete[] machine; // return result; 方法二:添加了对于模拟器的支持 static NSString *model; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ #if TARGET_IPHONE_SIMULATOR #ifdef DEBUG // 获取模拟器所对应的 device model model = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"]; #endif #else // 获取真机设备的 device model struct utsname systemInfo; uname(&systemInfo); model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; #endif }); return model; }
到此咱们就能够根据device model来判断是不是iPhone X了:
+ (bool) isIphoneX { NSString* model = [self getMachine]; BOOL isiPhoneX = [model isEqualToString:@"iPhone10,3"] || [model isEqualToString:@"iPhone10,6"] || [model hasPrefix:@"iPhone11,"]; return isiPhoneX; }
去年发布的第一代 iPhone X 对应的 device mode 为 iPhone10,3
和 iPhone10,6
,而今年最新发布 iPhone XS 对应 iPhone11,2
,iPhone XS Max 对应 iPhone11,4
和 iPhone11,6
,iPhone XR 对应 iPhone11,8
,完整的 device mode 数据参考这里:https://www.theiphonewiki.com/wiki/Models
另外对于各个屏幕的分辨率,能够参考这张图:
参考连接: