iOS11 Adatper

系统适配

iOS来了一段时间了,每次系统更新,在体验New Feature的同时,我们要做的还有适配,因为我们的App包含iPhone和iPad,所以这里的总结包含了这两种设备的适配!

废话不多说,上干货!

iOS11的判断

#define IOS11OrLater    (@available(iOS 11.0, *))

导航栏高度

导航栏高度一直是固定的64P, 到了iOS11这个规则被打破了!84!

iOS11之前

iOS11之前

iOS11之后

iOS11之后

其次,之前title和titleview是二选一的,在iOS11中可以通过开启

1
2
3
//根据prefersLargeTitles设置, 默认为NO;
self.navigationController.navigationBar.prefersLargeTitles = YES;

来选择设置大标题

设置效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
self.navigationController.navigationBar.prefersLargeTitles = YES;
self.title = @"这个是大标题";

UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,SCREEN_W , 44)]; //高度<=44
titleView.backgroundColor = [UIColor redColor];

UILabel *label = [UILabel new];
label.text = @"这是TitleView(位置可以调整)";
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:18];
label.frame = CGRectMake(10, 10, SCREEN_W, 44); //高度超过默认44 会向下偏移
[titleView addSubview:label];

self.navigationItem.titleView = titleView;

titleView支持autolayout,这要求titleView必须是能够自撑开的或实现了- intrinsicContentSize

1
2
3
4
- (CGSize)intrinsicContentSize {
return UILayoutFittingExpandedSize;
}

tabBar 高度

底部区域主要是iPhoneX与其他机型不一样, 一般机型高度为49, iPhoneX为83;

1
2
#define kTabBarHeight ([[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49)

导航栏返回按钮

返回按钮

之前如果通过某种方式自定义返回按钮,因为API的改变可能导致返回按钮下移

iOS 11之前

1
2
3
4
5
6
7
8
UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 18, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];

iOS 11 中setBackButtonTitlePositionAdjustment:UIOffsetMake没法把按钮移出navigation bar。

解决方法是设置navigationController的backIndicatorImage和backIndicatorTransitionMaskImage

1
2
3
4
UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationBar.backIndicatorImage = backButtonImage;
self.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;

automaticallyAdjustsScrollViewInsets废除

inset
iOS 11中ViewController的automaticallyAdjustsScrollViewInsets属性被废弃了,导致了 一些隐藏了系统导航栏或者自定义导航栏

1
2
3
self.automaticallyAdjustsScrollViewInsets = NO;
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;

automaticallyAdjustsScrollViewInsets属性被废弃了,顶部就多了一定的inset

解决方法:

1
2
3
4
5
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}

tableview header的问题

右边为正确样式

iOS 11中如果不实现-tableView: viewForFooterInSection: 和 -tableView: viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不会被调用。

这是因为estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension,导致高度计算不对,解决方法是实现对应方法或吧这三个属性设为0

tableview新特性

设置delaysContentTouches为NO, 不会立即触发cell的响应事件;
两根手指快速的轻击cell,可以同时选中两个cell进入编辑状态。如果两个手指存在不同步问题,则
会默认识别其中的一个手指表示单选cell;
新增了一个属性separatorInsetReference可以自定义一个cell分割线的边距;
cell或者表头表尾默认采用自适应高度的方案(造成UI紊乱的原因);
增加了numberOfLines属性来实现类似于UILabel一样的高度自适应变化;

获取地理位置权限的问题

在IOS11,原有的NSLocationAlwaysUsageDeion被降级为NSLocationWhenInUseUsageDeion;

需要在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框才会弹出;使用requestAlwaysAuthorization获取权限 IOS11系统弹框会把几种权限级别全部列出,供用户选择;

1
2
3
4
5
6
7
8
NSLocationUsageDescription
获取地理位置,精准推送服务
NSLocationWhenInUseUsageDescription
获取地理位置,精准推送服务
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSLocationAlwaysAndWhenInUseUsageDeion
App需要您的同意,才能始终访问位置

获取相册权限

iOS11以前:
NSPhotoLibraryUsageDescription:访问相册和存储照片到相册(读写),会出现用户授权;

iOS11之后:
NSPhotoLibraryUsageDescription:无需添加。默认开启访问相册权限(读),无需用户授权;
NSPhotoLibraryAddUsageDescription: 添加内容到相册(写),会出现用户授权;

xib编译问题

一般是打开以前的工程, 编译的时候xib报错, 例如:

warning: Internationalization is not available when compiling for targets before iOS 6.0

解决办法:
选择编译错误的xib文件,找到Builds for 改为iOS 7.0 and Later

iOS 7.0 and Later

iPhone X 屏幕适配

添加iPhoneX的Launch图1125x2436
使用LaunchScreen来当做缓冲页或者修改Assets中的LaunchImage,添加iPhoneX的Launch图1125*2436(竖屏);

点击选中iOS8会自动

参考文档

简书App适配iOS 11
iOS 11 安全区域适配总结
iOS11问题汇总