如果想看详细的iOS11变动,可转到这篇文章观看。
本文是直接写出了iPhoneX的相关适配
1. 首先是判断是否为X
这里我用的方法比较直接,暂时没碰到什么bug,如果各位有更好的方法请指教。
多说一句这里不能用宏定义 或者在Swift中不要写成let dzy_ifX: Bool = Screen_H == 812 ? true : false
这样定义有时候会出问题,大概是因为Screen_H
不同的情况可能会有不同。
let Screen_H = UIScreen.main.bounds.size.heightpublic var dzy_ifX: Bool { if Screen_H == 812 { return true }else { return false }}复制代码
2. UINavigationBar高度的更改
在老代码中,如果是手码编程,相信很多朋友都跟我一样项目里面有很多的64
这个数字,我是使用了一个变量来代替这个64
,在全局找一下所有的64
进行替换 我这个方法并不完善,很明显在我的项目里面,我没有使用到LargeTitle
,如果使用到了LargeTitle
这里就不是88
和64
了,可以自行修改一下。
public var NaviH: CGFloat { if Screen_H == 812 { return 88 }else { return 64 }}复制代码
下面的两张图都是iOS11之后多出一个Largetitle的
3. UITabbar高度的更改
在iPhoneX中,UITabBar的高度示意图如下。
其他的手机中,Tabbar
的高度为 49
,在iPhoneX中,多了一个圆角矩形区域,高度为 34
。 我所有界面的适配就是按着这个 TabBar
的样式来进行适配的。在 ViewController
中把最下面留出了一个 34
当然了,你也可以根据页面的具体情况来衡量用不用留这个 34
我在所有需要空出这个高度的地方,计算高度的时候都加了一个自定义的变量,如下所示。
public var TabRH: CGFloat { if Screen_H == 812 { return 34 }else { return 0 }}复制代码
4. automaticallyAdjustsScrollViewInsets属性的弃用
在iOS11中,该属性已经被弃用,如果有地方用到了这个,需要进行更改。 不过该属性是UIViewController的 而替代的contentInsetAdjustmentBehavior属性为UIScrollView的。 具体怎么修改可以自行考虑。 我只是简单的给UIViewController做了一个扩展,添加了如下方法。
func dzy_adjustsScrollViewInsets(_ scrollView: UIScrollView? = nil) { if #available(iOS 11.0, *) { if let scrollView = scrollView { scrollView.contentInsetAdjustmentBehavior = .never } } else { automaticallyAdjustsScrollViewInsets = false } }复制代码
5. 友情提示,iOS11以后界面中间的线不要使用CollectionView的背景色加间隔来做。
比如我这里,我是用了0.5
的间隔加灰色背景做的间隔,就会出现类似下图的问题。 然后我用白色背景,自己在每个cell
里面加0.5
宽度的线依旧会有这类问题。
大概的原因是cell
的frame
不是一个整数导致的。像这种一行4个cell
,cell
的宽度根据屏幕宽来计算的,不是整数很正常。 在iOS11之前,也会偶尔有类似的问题,比如你可以去搜一下,iOS UILabel字体模糊
,这种关键字的文章,讲的也都是一个问题。但是在iOS11之后这个问题变得更明显的,我感受最明显的就是UICollectionView
中用间隔和背景色划线的方式。 这种问题我所知道的最简单的处理方式是,用系统自带的数学函数,把你的View
或者Cell
的frmae
修改成整数的。类似下面这样,我使用的是floor
函数 :
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { switch indexPath.section { case 0: return CGSize(width: Screen_W, height: UI_H(150)) case 3: return CGSize(width: Screen_W, height: UI_H(85)) default: return CGSize(width: floor(Screen_W / 4.0), height: floor(UI_H(75))) } }复制代码
如果你对各种数学函数有兴趣,可以跳转我的另一篇文章