背景:iOS11为了兼容iphoneX特意将原来的layoutGuide换成了safeInset,就使用上来讲的话,这两个含义差不多。都是距离上下会有一定距离,平时没有导航栏和底部的工具栏或者tabBar的时候,上面是在状态栏的下面,下面直接挨着屏幕,当有的时候就是挨着导航栏的下面和挨着tabBar的上面,主要是为了防止上下的东西遮挡内容。区别的地方是safeInset多了左右两个,因为原来的机型横屏不会改变左右的间距,但是刘海屏会,横屏的时候就会显示出效果来。

有时候我们会自定义界面,比如视频播放,一般上面是挨着屏幕底部的,然后内容里面可能有些返回按钮全屏按钮这些,这个时候我们为了兼容iphoneX就是用safeInset,让按钮不显示在状态栏里面,一切都很美好,即使是普通屏幕也没有问题,因为是在状态栏下面。问题出在iOS11以前的系统是没有safeInset的,本来以为会自动转成layoutGuide,没有想到是直接变成了superView,也就是说如果上面是距离safeInset为0,iOS11系统会留出状态栏的距离,但是如果是iOS11以前的系统就变成了直接挨着屏幕顶部了,这时候有些按钮就和状态栏重叠了。这就是iOS11safeInset的兼容问题,怎么办呢?

思路:刚开始想要不在代码里面动态判断,然后动态调整,后来想了想,太麻烦了,比如在xib或者sb里面要先拉约束的线,然后再在代码里面设置,关键是如果顶部先放了一个容器的view里面再放的别的内容怎么办,有些情况又要求刘海两个耳朵背景要和顶部背景一致,这时候就尴尬了。后来想到了一个办法,可以增加一个距离superView的约束,让两个约束同时来确定位置。内容控件还是使用safeInset,然后再增加一个superView,值就写成>=20(状态栏高度),iOS11的系统新加的约束自动满足,当低于iOS11后面那个约束会增加距离顶部的距离,然而实际并没有效果,系统运行的时候去掉了后面那个新加的约束,因为在旧系统上两者是冲突的一个距离0,一个>=20,当然就冲突了。办法也有,最后还要设置约束的优先级,把第一个约束的优先级设置成比后面的小,这样冲突的时候就会优先满足后者,这时候系统也就正常显示了。