iPhone X适配
程序启动图,引导图等
iPhone X像素尺寸1125x2436,也就是说,你的启动图或者是闪屏页,App引导图等得新加一个图了,另外iPhone X用的是三倍图,开发用的逻辑分辨率即为375x812,可见iPhone X的宽度是和4.7尺寸一样的,只不过高度增加许多,程序启动页,可以专门为iPhone X增加(如下图),但App的其他页面,比如整个页面的背景图,自己做的引导页等就需要UI新给一张1125x2436的图,我的做法是在代码中对iPhone X加载这张新图,把这张新图放在原背景图等的三倍图位置上,因为原来的三倍图是适配5.5寸的,避免图被拉伸。
程序启动页(选择好之后,自然会多出选择iPhone X的程序启动页的一项)
引导图或背景图等
安全区
说到iPhone X适配问题,也得和大家解释一下安全区的概念,请看下图(此图来自莫贝网,发布者mobileui,在此十分感谢),绿色部分即是安全区,也就是我们开发时所使用的区域
下面详细介绍一下非安全区域的尺寸如下图(此图来自莫贝网,发布者mobileui,在此十分感谢)
如何适配顶部和底部
我们适配好程序启动页之后,会发现导航栏和小刘海灰常近,我们需要调整一下导航栏+状态栏高度了,原来偶们都是统一64,而现在估计要重新写个宏了改为88,KDeviceHeight = 812 ? 88 : 64 ; 底部适配的话,注意距离底部34(逻辑分辨率)就好,至于tabBar的话,还是根据不同产品需求而定。
如何禁止scrollView的自动偏移64像素
原来我们只需要
设置automaticallyAdjustsScrollViewInsets=NO就可以了,iOS 11之后
if(@available(iOS11.0, *)) {
self.scrollView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;
}else{
self.automaticallyAdjustsScrollViewInsets=NO;
}
关于info.plist
关于定位服务。原有的NSLocationAlwaysUsageDeion改为NSLocationWhenInUseUsageDeion,因此,在原来项目中使用requestAlwaysAuthorization获取定位权限,而未在plist文件配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框不会弹出。建议新旧key值都在plist里配置。
关于相册服务。原来的Privacy - Photo Library Usage Description 改为 Privacy - Photo Library Additions Usage Description,建议新旧key值都在plist里配置。
关于Xib和StoryBoard适配
如果你只需要适配iOS 9以上的恭喜你,你可以直接在右边打开安全区,直接做适配即可
如果不是的话,那就有点麻烦了,我是这样来做的,将需要进行iPhone X的约束拖出来,如下图
(按住control,直接拖即可)
代码也需要进行补充,如下,此时你该多注意是否超过了下边的安全区
if(KDeviceHeight ==812) {
self.navBgViewHeightConstraints.constant=88;
self.tipLabelHeightConstraints.constant+=24;
[selfupdateViewConstraints];
}
关于webVIew的适配
适配好导航栏,你也把webView扩充到整个屏幕,可能会发现这样的问题,webView内部的tabBar下边会露出一块内容
解决方案有两种:
plan A:要h5前端去适配iPhone X
plan B:我们将webView去缩减回原来的高度,也就是
[UIScreenmainScreen].bounds.size.height - 88 - 34
底部34的高度就靠我们自己写一个view来做修补,
记得webView进入二级网页时,要把这个view隐藏,并给webView的高度增加34
if(@available(iOS11.0, *)) {
self.webView.scrollView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;
}
另外,如果webView出现自动调整64的情况,可通过
if(@available(iOS11.0, *)) {
self.webView.scrollView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;
}
实现。