首先介绍一下最近遇到的一个问题:

通过上方截图可以看到文字上方有一空白区域(该现象在 iOS 11 之前的版本会出现),这并不是我想要的效果。该界面的 View 层级如下图:

以及 storyboard 中的布局如下:

automaticallyAdjustsScrollViewInsets 属性

看起来似乎一切正常,但是为什么实际界面会出现异常呢?通过多翻摸索,终于找到问题原因: UIViewController 的 automaticallyAdjustsScrollViewInsets 属性如果为 true 就会出现这个问题,而这个属性的默认值就是 true,这个属性在 storyboard 中对应的选项是 “Adjust Scroll View Insets”,如下图:

现在先将这个选项取消勾选运行一下试试:

可以看到上方奇怪的空白消失了,看来这个 “Adjust Scroll View Insets” 属性是个“坏”属性!应该始终将它取消勾选?那么如果真是这样 Apple 为什么还要提供这个选项并且默认选中呢?

“Adjust Scroll View Insets” 的作用

“Adjust Scroll View Insets” 的作用其实就是其字面意思即:“调整 Scroll View 的内边距”。

先将前面界面的布局做一点小改动:将 UIScrollView 的 Top 从 “SafeArea.Top” 更改为 “SuperView.Top”,然后将 UIViewController 的 “Adjust Scroll View Insets” 属性勾选。运行一下:

得到的是一个正常的界面,和前面正常的界面似乎没有什么不同,事实上是这样吗?再来看看它的层级结构吧:

这里 UIScrollView 其实是顶到界面顶部的,但是其内容却自动“下坠”到导航条之下,所以界面才会看起来正常,这就是 “Adjust Scroll View Insets” 的作用了。

总结

在 iOS 11之前的版本上 “Adjust Scroll View Insets” 这个属性不够“智能”,所以无论我们采用什么样的布局(Scroll View 直接到顶或者位于导航条下方)都会自动下坠其内容,因此当我们在布局的时候如果已经考虑了顶部的导航条和 status bar 的高度同时采用 “Adjust Scroll View Insets” 就会造成多余的空白情况

至于用不用这个属性,可以根据自己的实际情况来决定,要么 Scroll View 直接到顶,要么禁掉这个属性。