在写App的引导界面的时候遇到了这个问题,其实很早以前就遇到了这个问题,当时就是只是用一句代码就可以去搞定。
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
}
在UIViewController中有一个属性
@available(iOS, introduced: 7.0, deprecated: 11.0, message: "Use UIScrollView's contentInsetAdjustmentBehavior instead")
open var automaticallyAdjustsScrollViewInsets: Bool // Defaults to YES
此属性的默认值为true,这使得当有滚动视图插入,UIViewController会去考虑状态栏、搜索栏、导航栏、工具栏或标签栏所消耗的屏幕区域。如果UIViewController自己管理滚动视图的插入调整,则将此属性设置为false。
而在iOS11中UIViewController的这个属性已经被废除,转而代替它的是的ScrollView的两个属性:
open var adjustedContentInset: UIEdgeInsets { get }
open var contentInsetAdjustmentBehavior: UIScrollViewContentInsetAdjustmentBehavior
首先来看看安全区域safeAreaInsets,官方文档解释如下:
安全区域就是不被状态栏、搜索栏、导航栏、工具栏或标签栏所消耗的屏幕区域所覆盖。safeAreaInsets这个属性其实指的就是一个view距离该view的安全区域的边距。如果一个view全部在它父视图的安全区域内,则SafeAreaInsets值为(0,0,0,0)。如果多了一个信号栏,那SafeAreaInset值为(20,0,0,0)。
var adjustedContentInset: UIEdgeInsets { get }
这是我们前面提到过的ScrollView的一个属性,使用此属性获得在其中绘制内容的调整区域。简单来说就是我们ScrollerView中呈现的内容需要上下左右调整多少会由这个属性来进行控制。iOS11以前ScrollView内容与View边缘距离是由contentInset来决定的而在iOS11后使用的是adjustedContentInset(内容偏移量)。那紧接着我们来说一下这个属性是如何进行计算的,这个时候就需要用到contentInsetAdjustmentBehavior这个枚举属性了。
@available(iOS 11.0, *)
public enum UIScrollViewContentInsetAdjustmentBehavior : Int {
case automatic // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
case scrollableAxes // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
case never // contentInset is not adjusted
case always // contentInset is always adjusted by the scroll view's safeAreaInsets
}
automatic和scrollableAxes属性依赖于controller 的automaticallyAdjustsScrollViewContentInset属性为true
(1)automatic
adjustedContentInset = safeAreaInset + contentInset
(2)scrollableAxes
在可以滚动的方向上 adjustedContentInset = safeAreaInset + contentInset
在不可以滚动的方向上 adjustedContentInset = contentInset
(3)never
adjustedContentInset = contentInset
(4)always
adjustedContentInset = safeAreaInset + contentInset
iPhone X由于是刘海屏幕,安全区域的问题官方的文档也说明的很详细了,可以戳链接:https://developer.apple.com/design/human-interface-guidelines/ios/overview/iphone-x/
文章的最后再抛出一个问题:现在再来看看我最近遇到的iOS10的一个问题,隐藏了导航栏,然后进入页面后让WKWebView满铺整个屏幕,进入之后发现网页的内容整体下降了一个信号栏的高度。
因为WKWebView是继承于ScrollView的,前面提到过在iOS11之前都是由UIViewController的automaticallyAdjustsScrollViewInsets(默认是true)属性来控制是否让他自己去适应滚动视图的插入,而我没有对这个属性进行修改,所以会自适应让整个网页内容往下移动了一个信号栏的高度。