iOS11及iPhoneX适配
navigation bar适配
1. navigation bar
导航栏的高度变化。iOS11之前导航栏的默认高度为64pt(20+44),iOS11之后导航栏新增一个属性prefersLargeTitles来控制是否显示为大标题。这个开关默认是关闭的,如果打开,导航栏的高度就变成了96pt。在iPhoneX上,由于statusBar从20pt变成了44pt,所以导航栏的总高度就变成了88pt。
自定义导航栏。自定义导航栏在iOS11上会出现布局错乱的bug,需要重写UINavigationBar的layoutSubviews方法调整布局。并且由于titleView支持了autolayout,所以titleView需要能够自撑开,或者实现intrinsicContentSize方法。
Intrinsic Contenet Size – Intrinsic Content Size:固有大小。顾名思义,在AutoLayout中,它作为UIView的属性(不是语法上的属性),意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。 比如:大家都知道在使用AutoLayout的时候,UILabel是不用指定尺寸大小的,只需指定位置即可,就是因为,只要确定了文字内容,字体等信息,它自己就能计算出大小来。
2. UIScrollView、UITableView、UICollectionView
- 由于iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增了contentInsetAdjustmentBehavior属性.所以当tableView超出Safe Area时,系统会自动调整SafeAreaInset的值,从而影响到adjustedContentInset的值,导致tableView的内容到边缘的距离发生了变化,会下移20pt或者64pt。解决方法是可以设置tableView的contentInsetAdjustmentBehavior属性,修改代码如下:
#ifdef __IPHONE_11_0
if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
#endif
- 如果项目中有使用到masonry的,则需要适配一下safeArea.
if (@available(iOS 11.0, *)) {
make.edges.equalTo()(self.view.safeAreaInsets)
} else {
make.edges.equalTo()(self.view)
}
3.适配iPhoneX
- iPhoneX相对其他机型,主要差别为以下几点:
- Safe Area
- 状态栏由20pt变成44pt
- 下方虚拟home键高度为34pt
- 导航栏加入大标题模式
- 适配iPhoneX的修改点:
- iPhoneX需要一张更高分辨率的图片来作为启动图片,需要在images.xcassets中用launchImage设置的启动图中加入1125*2436的图片。
- 在iPhoneX上并不建议隐藏状态栏,我们app中为了增加用户的沉浸感可以在启动页和欢迎页先隐藏导航栏,进入应用之后再显示。先将UIViewControllerBasedStatusBarAppearance设置为NO
然后将工程TARGETS里面General中的Hide Status Bar勾选上(因为一开始进来是要先隐藏)
最后在启动页、欢迎页显示完之后调用。 - 虚拟home键。iPhone X取消了实体Home键,取而代之的是虚拟的Home键。虚拟home键高度占34pt,在UIScrollView、TableView、CollectionView上就需要做适配。适配的主要内容也就是在滑动到底部的时候需要留出34pt的空隙,可以参考系统的setting的做法。具体适配如下:
if (IS_iPhone_X) {
UIView * footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 34)];
self.materialCenterTableView.tableFooterView = footerView;
}
- 关于iOS11系统以及iPhoneX的适配主要整理以上几点,大家如果有补充欢迎提出~