導(dǎo)航欄遮住View問題的詳細(xì)總結(jié)(已更新iOS11)

網(wǎng)上關(guān)于導(dǎo)航欄遮蓋問題的文章很多,但是我搜了好久沒有看到圖文說明的,看大神們的純代碼+理論很頭疼,索性自己寫一遍

- edgesForExtendedLayout

默認(rèn)設(shè)置是 UIRectEdgeAll,即viewController的View會延伸到最頂端,分別設(shè)置為UIRectEdgeNone和UIRectEdgeAll用reveal來看看效果.

1、 UIRectEdgeNone

UIRectEdgeNoneCode.png
UIRectEdgeNone.png

上圖中畫圈圈的Y是64,說明view剛好從導(dǎo)航欄下面開始的。

2、UIRectEdgeAll

UIRectEdgeAllCode.png
UIRectEdgeAll.png

這個已經(jīng)很明顯了

3、translucent設(shè)置為YES

- translucent 字面意思就是半透明,默認(rèn)值是 YES
Code.png
YES.png

上圖可以看出,在設(shè)置translucent=Y(jié)ES的時候(默認(rèn)就是YES,其實(shí)不寫也一樣),導(dǎo)航欄明顯有點(diǎn)偏藍(lán)

4、translucent設(shè)置為NO:

Paste_Image.png
NO.png

對比也很明顯。當(dāng)transulent=NO的時候,不管edgesForExtendedLayout設(shè)置成UIRectEdgeAll還是UIRectEdgeNone,view都是從導(dǎo)航欄底部開始
,下面會有解釋。

5、UIRectEdgeNone的情況

上面3和4都是在UIRectEdgeAll的情況下設(shè)置的,下面再看看UIRectEdgeNone的情況下呢,
transulent=Y(jié)ES的時候:

Paste_Image.png
導(dǎo)航欄變灰色了.png

這時候?qū)Ш綑诰谷蛔兓疑?,既不是半透明的藍(lán)色,也不是白色,為什么是灰色?在reveal中看看視圖結(jié)構(gòu)就知道了:

注意看左邊第二層視圖.png

原來是UIWindow的是黑色的,半透明一下就是灰色了,紅色圈起來的部分寫明了Background=Black Color;注意這和reveal工具的背景色還是有區(qū)別的。

transulent=NO的時候,這時候就比較特殊了,當(dāng)transulent=NO的時候,不管edgesForExtendedLayout設(shè)置成UIRectEdgeAll還是UIRectEdgeNone,view都是從導(dǎo)航欄底部開始
NoneCode.png

None.png

注意看紅圈的y=64

UIRectEdgeAllCode.png
UIRectEdgeAll.png

同樣紅圈的y=64,

那么為題來了,怎么讓translucent=NO的時候,view也能從(0,0)開始布局呢?

蘋果也考慮到了這種需求,提供了 extendedLayoutIncludesOpaqueBars 這個屬性。
extendedLayoutIncludesOpaqueBars 默認(rèn)值是NO,下面把它改為YES

extendedLayoutIncludesOpaqueBars.png

使用了extendedLayoutIncludesOpaqueBars再來看看效果:

extendedLayoutIncludesOpaqueBarsYES.png

此時view成功從(0,0)開始布局。

6、automaticallyAdjustsScrollViewInsets

還有一個屬性:

- automaticallyAdjustsScrollViewInsets:
默認(rèn)值YES,表示在全屏模式下會自動修改第一個添加到 
rootView 的 scrollview 的 contentInset 為(64,0,0,0)

先設(shè)置automaticallyAdjustsScrollViewInsets為NO

automaticallyAdjustsScrollViewInsets在iOS11中已廢棄,需要使用ScrollView子類的contentInsetAdjustmentBehavior屬性來代替(比如寫成self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;)
Paste_Image.png
此時tableView被導(dǎo)航欄遮蓋.png

此時tableView被導(dǎo)航欄遮蓋。

再把a(bǔ)utomaticallyAdjustsScrollViewInsets設(shè)置為YES

YES.png
此時tableView從導(dǎo)航欄底部開始.png

此時tableView從導(dǎo)航欄底部開始

需要注意的是automaticallyAdjustsScrollViewInsets=YES只對VC**第一個添加到 rootView 的 scrollview **有效。

如果我們在已經(jīng)有了tableview的前提再加一個tableView,那么第二個tableView還是會被導(dǎo)航欄遮蓋:

Paste_Image.png
第二個tableView還是會被導(dǎo)航欄遮蓋.png

如上圖所示,第二個tableView還是會被導(dǎo)航欄遮蓋(紅色箭頭所指的0代表tableView的第一個cell)

安全區(qū)(safeArea)

在iOS11 中引入了安全區(qū)的概念,說白了就是:你放在這個區(qū)域里面的視圖是不會被NavigationBar和TabBar和StatusBar遮住的.(前提是你不去手動修改安全區(qū)范圍的情況下),
安全區(qū)本身不是一個View,不會顯示在我們的視圖層級上,只是給你參考用.


safeArea

safeArea
safeAreaInset屬性

iOS11之前,如果有tableview向下偏移64的情況的話.64這個值是在contentInset里面獲取的,iOS11之后改成了從safeAreaInset獲取.但是contentInset這個屬性 !!!!依舊是有用的,并沒有廢棄. !!!!

contentInsetAdjustmentBehavior屬性

上面的說過的automaticallyAdjustsScrollViewInsets屬性在iOS 11中已經(jīng)被廢棄了(設(shè)置這個沒用了),改用UIScrollview子類的contentInsetAdjustmentBehavior屬性來代替
例如

self.tableview.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;//使用這行代碼來代替



contentInsetAdjustmentBehavior屬性有4個枚舉值:{
  UIScrollViewContentInsetAdjustmentAutomatic:在有導(dǎo)航欄的VC中,這個屬性會設(shè)置上部和底部的adjustedContentInset值,
      方式為adjustedContentInset = safeAreaInset + contentInset。其他情況下與UIScrollViewContentInsetAdjustmentScrollableAxes相同

  UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滾動方向上adjustedContentInset = safeAreaInset + contentInset,在不可滾動方向上adjustedContentInset = contentInset

  UIScrollViewContentInsetAdjustmentNever: adjustedContentInset = contentInset

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

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

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