iOS 适配iOS11+ 及 iPhone X系列
官方文档 https://developer.apple.com/ios/human-interface-guidelines
一、一些判断
判断系统版本
方式一、
#ifdef __IPHONE_11_0
//在这里搞iOS11的事情
#else
//在这里搞低版本的事情
#endif
方式二、
#if TBC_IS_IPHONE_OS_11_LATER
#else
#endif
方式三、
if (@available(iOS 11.0, *))
是否为iPhone X+
方式一、(废弃)
#define IS_IPHONE_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
方式二、(废弃)
#define IS_IPHONE_X (( fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)812) < DBL_EPSILON ) || (fabs((double)[[UIScreen mainScreen] bounds].size.width - (double)812) < DBL_EPSILON ))
方式三、
systemInfo.machine
方式四、(推荐)
static inline BOOL isIPhoneXSeries() {
BOOL iPhoneXSeries = NO;
if (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPhone) {
return iPhoneXSeries;
}
if (@available(iOS 11.0, *)) {
UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
if (mainWindow.safeAreaInsets.bottom > 0.0) {
iPhoneXSeries = YES;
}
}
return iPhoneXSeries;
}
二、tableView下移20或64 或 在iPhone X下上划多出一点距离
automaticallyAdjustsScrollViewInsets废弃
打印出来看看是否是安全区域引起的tableView下移问题,主要是safeAreaInsets
如下代码片段,可以看出系统对tableView向下调整了20pt的距离,因为tableView超出了安全区域范围,被statusbar覆盖
tableview.contentInset: {64, 0, 60, 0}
tableview.safeAreaInsets: {20, 0, 0, 0}
tableview.adjustedContentInset: {84, 0, 60, 0}
推荐解决方案
1、2无非就是判断写法
1、
#ifdef __IPHONE_11_0
if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
#endif
2、
判断为>=11
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
三、其他下移问题
在iOS 11中默认启用Self-Sizing,,Headers, footers, and cells都默认开启了Self-Sizing
所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension
解决方案
1、推荐
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
2、需同时实现
heightForHeaderInSection
viewForHeaderInSection
四、iOS 11相册写权限
iOS 11 默认开启读权限,但是写权限还要增加
Privacy - Photo Library Additions Usage Description
iOS 11之前需要添加
Privacy - Photo Library Usage Description
在 iOS 11 中必须支持 When In Use 授权模式(NSLocationWhenInUseUsageDescription)
如果不提供When In Use 授权模式,那么 Always 相关授权模式也无法正常使用。
新增
NSLocationAlwaysAndWhenInUseUsageDescription
五、新增
UISearchController *searchController API_AVAILABLE(ios(11.0))
增加API_AVAILABLE(ios(11.0))
或 NS_AVAILABLE_IOS(9_0)
例如
@property (nonatomic, retain, nullable) UISearchController *searchController API_AVAILABLE(ios(11.0));
方法同时适用
废弃的写法
- (void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller NS_DEPRECATED_IOS(3_0,8_0);
SVP过期方法书写方式
+ (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead.")));
iPhone X+
如果用到Face ID 那么NSFaceIDUsageDescription权限加一下
开发只关心逻辑分辨率(point),目前有
320 X 480 (3GS、4、4s)
320 X 568 (5、5c、5s)
375 X 667 (6、7、8)
414 X 736 (6p、7p、8p)16:9
375 X 812 (X、XS)13:6
414 X 896 (XR)
414 X 896 (XS Max)
首先搞个LaunchImage
iPhone X 、XS
尺寸:1125px × 2436px
iPhone XR
尺寸:828px x 1792px
iPhone XS Max
尺寸:1242px x 2688px
状态栏由20增长到20 + 24 = 44
竖屏Tab Bar高度由49增长到49 + 34 = 83
键盘高度由216增长为216 + 75 = 291(在竖屏下包含Home Indicator)
注:竖屏Home Indicator高度为34,横屏时为21
Safe Area 与 Layout Margins
竖屏
上部留 44pt 給 Status Bar
Layout Margins 通常左右内缩 16pt。
横屏
Safe Area 左右两侧皆内缩 44pt
Layout Margins 通常左右再内缩 16pt