美文网首页
iOS11 安全区域 iPhone X

iOS11 安全区域 iPhone X

作者: 安心做个差生 | 来源:发表于2018-07-22 17:09 被阅读0次

    在写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)属性来控制是否让他自己去适应滚动视图的插入,而我没有对这个属性进行修改,所以会自适应让整个网页内容往下移动了一个信号栏的高度。

    相关文章

      网友评论

          本文标题:iOS11 安全区域 iPhone X

          本文链接:https://www.haomeiwen.com/subject/qxxrmftx.html