iPhone X適配指南之Safe Area

前言

Safe areas的作用是幫助我們將views放置在整個(gè)視圖中可見的正確的位置。UIKit定義下的View controllers中常常會(huì)有一部分特殊的views會(huì)被放置在最上方。例如:導(dǎo)航控制器NavigationController的NavigationBar就被放置在視圖的最頂部。即使有些時(shí)候這些放置在最頂部的views是透明的或者部分透明的,但是它仍然會(huì)遮蓋住在此位置的其他內(nèi)容。(注:此處最頂部不是指Y軸坐標(biāo)為0的頂部,而是視圖層級(jí)的頂部,導(dǎo)航欄的位置永遠(yuǎn)在視圖最頂部不會(huì)被其他view遮蓋?。?/p>

使用Safe areas來幫助我們布置我們的內(nèi)容。每個(gè)view都包含一個(gè)自身的layout guide(這一部分可以參考 safeAreaLayoutGuide
),我們可以用它來創(chuàng)建對(duì)view 的約束,如果你并沒有使用 Auto Layout 來定位你的view,我們可以通過 safeAreaInsets
屬性來獲得內(nèi)部的值加以處理達(dá)到我們的目的。

圖1

圖1展示了日歷App的兩個(gè)頁面,并且解釋了這兩個(gè)不同的頁面下關(guān)聯(lián)的Safe area的部分。

擴(kuò)展安全區(qū)域并包括自定義的views

我們可以定義一個(gè)容器視圖控制器container viewcontroller并通過添加子控制器child viewcontroller來將子控制器的視圖展示出來(注:這一部分的容器控制器其實(shí)代表的是諸如:NavigationController、TabbarController之類的視圖控制器)。之后,更新child viewcontroller的safe area來排除被container viewcontroller視圖遮蓋的部分。UIKit下的container viewcontroller已經(jīng)自動(dòng)調(diào)整了child viewcontroller的安全區(qū)域以便正確布局。例如:NavigationController 會(huì)自動(dòng)調(diào)整其之下的child viewcontroller的safe area以便放置NavigationBar。如果我們想要調(diào)整一個(gè)child viewcontroller的safe area可以通過修改additionalSafeAreaInsets屬性。

假設(shè)我們定義了一個(gè)container controller并在屏幕底部和邊緣放置了我們自定義的views,如圖2

圖2

因?yàn)檫@兩個(gè)custom view將會(huì)遮蓋child viewcontroller 中的內(nèi)容。所以我們必須調(diào)整child viewcontroller的safe area以便正確布局。
下面的代碼是container view controller中的 viewDidAppear(_:)
方法,這個(gè)方法的作用就是調(diào)整child viewcontroller中的safe area。在這個(gè)方法中修改safe area的原因是在視圖被添加到view hierarchy之前,safeAreaInsets這個(gè)值都是不準(zhǔn)確的。

override func viewDidAppear(_ animated: Bool) {
   var newSafeArea = view.safeAreaInsets

   // Adjust the safe area to accommodate 
   //  the width of the side view.
   if let sideViewWidth = sideView?.bounds.size.width {
      newSafeArea.right += sideViewWidth
   }

   // Adjust the safe area to accommodate 
   //  the height of the bottom view.
   if let bottomViewHeight = bottomView?.bounds.size.height {
      newSafeArea.bottom += bottomViewHeight
   }

   // Adjust the safe area insets of the 
   //  embedded child view controller.
   let child = self.childViewControllers[0]
   child.additionalSafeAreaInsets = newSafeArea
}

官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iPhone X已經(jīng)發(fā)布有一段時(shí)間了,最近我負(fù)責(zé)把公司的產(chǎn)品Cisco Spark適配iPhone X。雖然還沒有...
    小胡昵稱已被占用閱讀 726評(píng)論 0 0
  • iOS 7 之后蘋果給 UIViewController 引入了 topLayoutGuide 和 bottomL...
    IOSCoderYummy閱讀 846評(píng)論 0 0
  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 2,054評(píng)論 0 2
  • 原文出自我在團(tuán)隊(duì)技術(shù)公眾號(hào)發(fā)表的 《隨手記在iPhone X上的真機(jī)適配實(shí)踐總結(jié)》 Intro 前幾天,隨手記提交...
    JOJOTOV閱讀 2,446評(píng)論 1 15
  • 莫名地心情不爽。 睡覺前,看見余蕓的信息,不知名地想起。 感動(dòng)成了狗。
    try2閱讀 206評(píng)論 0 0

友情鏈接更多精彩內(nèi)容