1.edgesForExtendedLayout
、automaticallyAdjustsScrollViewInsets
和extendedLayoutIncludesOpaqueBars
這三個(gè)屬性適用于iOS 11以前對(duì)布局的調(diào)整
①edgesForExtendedLayout
:當(dāng)在UINavigationController內(nèi)添加UIViewController的時(shí)候昼丑,用來(lái)控制UIViewController中的view的大小呻逆。當(dāng)你將UIViewController的該值設(shè)置為UIRectEdgeAll
(默認(rèn)值)的時(shí)候,UIViewController會(huì)延伸至UINavigationBar以下鋪滿整個(gè)屏幕菩帝,效果如下圖(紅色半透明效果是導(dǎo)航欄設(shè)置導(dǎo)致的):
②automaticallyAdjustsScrollViewInsets
:當(dāng)UIViewController的view
或者view的第一個(gè)子View
是UIScrollView及其子類的時(shí)候咖城,有時(shí)候我們希望視圖可以滾動(dòng)到導(dǎo)航欄以下的區(qū)域,但是如果只是單純的把edgesForExtendedLayout
設(shè)置為UIRectEdgeAll
的話視圖最開(kāi)始會(huì)有部分內(nèi)容被蓋在導(dǎo)航欄以下呼奢,將automaticallyAdjustsScrollViewInsets
設(shè)置為YES
(默認(rèn)值)則會(huì)自動(dòng)幫你調(diào)整視圖的Insets使內(nèi)容剛好從導(dǎo)航欄底下開(kāi)始宜雀,如下圖所示(此時(shí)edgesForExtendedLayout
為UIRectEdgeAll
, 列表鋪滿整個(gè)屏幕):
③extendedLayoutIncludesOpaqueBars
:當(dāng)你將導(dǎo)航欄或者狀態(tài)欄設(shè)為不透明的時(shí)候,你會(huì)發(fā)現(xiàn)即使將edgesForExtendedLayout
設(shè)置為UIRectEdgeAll
握础,view也不會(huì)擴(kuò)充到導(dǎo)航欄或者狀態(tài)欄下去辐董,這是因?yàn)?code>extendedLayoutIncludesOpaqueBars的默認(rèn)值是NO。當(dāng)將其改為YES的時(shí)候就可以實(shí)現(xiàn)延伸效果了禀综。
2.additionalSafeAreaInsets
和UIScrollVIew及其子類的contentInsetAdjustmentBehavior
以上是基于iOS11的safeAreaInsets
出現(xiàn)而出現(xiàn)的調(diào)整布局的API
①additionalSafeAreaInsets
:如果你想在默認(rèn)的safeAreaInset
的基礎(chǔ)上對(duì)當(dāng)前的UIViewController的safeAreaInsets
做一些額外的調(diào)整简烘,那就可以使用這個(gè)屬性。舉個(gè)例子定枷,如果系統(tǒng)當(dāng)前的safeAreaInsets
是(top: 88.0, left: 0.0, bottom: 34.0, right: 0.0)
孤澎,并且你將additionalSafeAreaInsets
設(shè)置為(top:5, left:5, bottom:5, right:5)
,那么最后的safeAreaInsets
就會(huì)變成(top: 93.0, left: 5.0, bottom: 39.0, right: 5.0)
依鸥。由此引申的一個(gè)問(wèn)題就是永遠(yuǎn)
在viewSafeAreaInsetsDidChange
這個(gè)回調(diào)里取獲取safeAreaInset
亥至,再對(duì)視圖做調(diào)整。
②contentInsetAdjustmentBehavior
:在iOS 11之后automaticallyAdjustsScrollViewInsets
失效,將其設(shè)置為UIScrollViewContentInsetAdjustmentNever
與automaticallyAdjustsScrollViewInsets
設(shè)置為NO同效姐扮,即不做任何調(diào)整(一般在基類寫布局的時(shí)候會(huì)這么做)絮供。針對(duì)其他的幾個(gè)值,其中UIScrollViewContentInsetAdjustmentScrollableAxes
表示如果某個(gè)方向可滾動(dòng)(分為contentSize的寬或者高大于該視圖寬或者高以及alwaysBounceXXX設(shè)為YES這兩種情況)茶敏,則其該方向的Inset將被設(shè)置為safeAreaInset的值壤靶,使可滾動(dòng)方向的內(nèi)容擁有足夠的展示空間。UIScrollViewContentInsetAdjustmentAlways
則不管可不可以滾動(dòng)都預(yù)留safeAreaInset的Inset空間出來(lái)惊搏。UIScrollViewContentInsetAdjustmentAutomatic
比較特殊贮乳,它在大部分情況下和UIScrollViewContentInsetAdjustmentScrollableAxes
一致,但是當(dāng):
- UIScrollView 類型的視圖在水平軸方向是可滾動(dòng)的恬惯,垂直軸是不可滾動(dòng)的向拆。
- ViewController 視圖里的第一個(gè)子控件是 UIScrollView 類型的視圖。
- ViewController 是 navigation 或者 tab 類型控制器的子視圖控制器酪耳。
- automaticallyAdjustsScrollViewInsets = YES
的時(shí)候浓恳,它等于UIScrollViewContentInsetAdjustmentAlways
。
3