iOS11 導航欄適配

默認設置是 UIRectEdgeAll,即viewController的View會延伸到最頂端,分別設置爲UIRectEdgeNone和UIRectEdgeAll用reveal來看看效果.安全

一、 UIRectEdgeNone

 
UIRectEdgeNoneCode.png
 
UIRectEdgeNone.png

上圖中畫圈圈的Y是64,說明view恰好從導航欄下面開始的。工具

二、UIRectEdgeAll

 
UIRectEdgeAllCode.png
 
UIRectEdgeAll.png

這個已經很明顯了佈局

三、translucent設置爲YES

- translucent 字面意思就是半透明,默認值是 YES 
 
Code.png
 
YES.png

上圖能夠看出,在設置translucent=YES的時候(默認就是YES,其實不寫也同樣),導航欄明顯有點偏藍ui

四、translucent設置爲NO:

 
Paste_Image.png
 
NO.png

對比也很明顯。當transulent=NO的時候,無論edgesForExtendedLayout設置成UIRectEdgeAll仍是UIRectEdgeNone,view都是從導航欄底部開始
,下面會有解釋。spa

五、UIRectEdgeNone的狀況

上面3和4都是在UIRectEdgeAll的狀況下設置的,下面再看看UIRectEdgeNone的狀況下呢,
transulent=YES的時候:3d

 
Paste_Image.png
 
導航欄變灰色了.png

這時候導航欄居然變灰色了,既不是半透明的藍色,也不是白色,爲何是灰色?在reveal中看看視圖結構就知道了:code

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

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

transulent=NO的時候,這時候就比較特殊了,當transulent=NO的時候,無論edgesForExtendedLayout設置成UIRectEdgeAll仍是UIRectEdgeNone,view都是從導航欄底部開始
 
NoneCode.png

 
None.png

注意看紅圈的y=64it

 
UIRectEdgeAllCode.png
 
UIRectEdgeAll.png

一樣紅圈的y=64,io

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

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

 
extendedLayoutIncludesOpaqueBars.png

使用了extendedLayoutIncludesOpaqueBars再來看看效果:

 
extendedLayoutIncludesOpaqueBarsYES.png

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

六、automaticallyAdjustsScrollViewInsets

還有一個屬性:

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

先設置automaticallyAdjustsScrollViewInsets爲NO

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

此時tableView被導航欄遮蓋。

再把automaticallyAdjustsScrollViewInsets設置爲YES

 
YES.png
 
此時tableView從導航欄底部開始.png

此時tableView從導航欄底部開始

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

若是咱們在已經有了tableview的前提再加一個tableView,那麼第二個tableView仍是會被導航欄遮蓋:

 
Paste_Image.png
 
第二個tableView仍是會被導航欄遮蓋.png

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

安全區(safeArea)

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


 
safeArea

 
safeArea
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 } 
相關文章
相關標籤/搜索