網上關于導航欄遮蓋問題的文章很多,但是我搜了好久沒有看到圖文說明的,看大神們的純代碼+理論很頭疼,索性自己寫一遍
- edgesForExtendedLayout
默認設置是 UIRectEdgeAll,即viewController的View會延伸到最頂端,分別設置為UIRectEdgeNone和UIRectEdgeAll用reveal來看看效果.
1、 UIRectEdgeNone
上圖中畫圈圈的Y是64,說明view剛好從導航欄下面開始的。
2、UIRectEdgeAll
這個已經很明顯了
3、translucent設置為YES
- translucent 字面意思就是半透明,默認值是 YES
上圖可以看出,在設置translucent=YES的時候(默認就是YES,其實不寫也一樣),導航欄明顯有點偏藍
4、translucent設置為NO:
對比也很明顯。當transulent=NO的時候,不管edgesForExtendedLayout設置成UIRectEdgeAll還是UIRectEdgeNone,view都是從導航欄底部開始
,下面會有解釋。
5、UIRectEdgeNone的情況
上面3和4都是在UIRectEdgeAll的情況下設置的,下面再看看UIRectEdgeNone的情況下呢,
transulent=YES的時候:
這時候導航欄竟然變灰色了,既不是半透明的藍色,也不是白色,為什么是灰色?在reveal中看看視圖結構就知道了:
原來是UIWindow的是黑色的,半透明一下就是灰色了,紅色圈起來的部分寫明了Background=Black Color;注意這和reveal工具的背景色還是有區別的。
transulent=NO的時候,這時候就比較特殊了,當transulent=NO的時候,不管edgesForExtendedLayout設置成UIRectEdgeAll還是UIRectEdgeNone,view都是從導航欄底部開始
注意看紅圈的y=64
同樣紅圈的y=64,
那么為題來了,怎么讓translucent=NO的時候,view也能從(0,0)開始布局呢?
蘋果也考慮到了這種需求,提供了 extendedLayoutIncludesOpaqueBars 這個屬性。
extendedLayoutIncludesOpaqueBars 默認值是NO,下面把它改為YES
使用了extendedLayoutIncludesOpaqueBars再來看看效果:
此時view成功從(0,0)開始布局。
6、automaticallyAdjustsScrollViewInsets
還有一個屬性:
- automaticallyAdjustsScrollViewInsets:
默認值YES,表示在全屏模式下會自動修改第一個添加到
rootView 的 scrollview 的 contentInset 為(64,0,0,0)
先設置automaticallyAdjustsScrollViewInsets為NO
automaticallyAdjustsScrollViewInsets在iOS11中已廢棄,需要使用ScrollView子類的contentInsetAdjustmentBehavior屬性來代替(比如寫成self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;)
此時tableView被導航欄遮蓋。
再把automaticallyAdjustsScrollViewInsets設置為YES
此時tableView從導航欄底部開始
需要注意的是automaticallyAdjustsScrollViewInsets=YES只對VC**第一個添加到 rootView 的 scrollview **有效。
如果我們在已經有了tableview的前提再加一個tableView,那么第二個tableView還是會被導航欄遮蓋:
如上圖所示,第二個tableView還是會被導航欄遮蓋(紅色箭頭所指的0代表tableView的第一個cell)
安全區(safeArea)
在iOS11 中引入了安全區的概念,說白了就是:你放在這個區域里面的視圖是不會被NavigationBar和TabBar和StatusBar遮住的.(前提是你不去手動修改安全區范圍的情況下),
安全區本身不是一個View,不會顯示在我們的視圖層級上,只是給你參考用.
safeAreaInset屬性
iOS11之前,如果有tableview向下偏移64的情況的話.64這個值是在contentInset里面獲取的,iOS11之后改成了從safeAreaInset獲取.但是contentInset這個屬性 !!!!依舊是有用的,并沒有廢棄. !!!!
contentInsetAdjustmentBehavior屬性
上面的說過的automaticallyAdjustsScrollViewInsets屬性在iOS 11中已經被廢棄了(設置這個沒用了),改用UIScrollview子類的contentInsetAdjustmentBehavior屬性來代替
例如
self.tableview.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;//使用這行代碼來代替
contentInsetAdjustmentBehavior屬性有4個枚舉值:{
UIScrollViewContentInsetAdjustmentAutomatic:在有導航欄的VC中,這個屬性會設置上部和底部的adjustedContentInset值,
方式為adjustedContentInset = safeAreaInset + contentInset。其他情況下與UIScrollViewContentInsetAdjustmentScrollableAxes相同
UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滾動方向上adjustedContentInset = safeAreaInset + contentInset,在不可滾動方向上adjustedContentInset = contentInset
UIScrollViewContentInsetAdjustmentNever: adjustedContentInset = contentInset
UIScrollViewContentInsetAdjustmentAlways: adjustedContentInset = safeAreaInset + contentInset
}