Property | Class |
---|---|
edgesForExtendedLayout | UIViewController |
extendedLayoutIncludesOpaqueBars | UIViewController |
automaticallyAdjustsScrollViewInsets | UIViewController |
translucent | NavigationBar |
edgesForExtendedLayout屬性的系統默認值爲UIRectEdgeAll:意味着當導航控制器的導航欄爲半透明效果時,子控制器self.view
佈局的起始位置將從屏幕邊緣左上角開始。佈局
extendedLayoutIncludesOpaqueBars屬性系統默認爲NO,Opaque
表明非透明,not Includes
意味着導航欄不是半透明時,即使當前是UIRectEdgeAll,self.view的佈局起始位置依舊是從導航欄下方開始。設計
translucent屬性值會決定導航欄是否有半透明效果。translucent爲NO,意味着導航欄爲非透明,此時如上文所述,即使當前是UIRectEdgeAll,因爲extendedLayoutIncludesOpaqueBars爲默認NO,self.view的佈局起始位置依舊是從導航欄下方開始。
須要特別注意的是:code
根據官方文檔所述:translucent會受navigationBar的backgroudImage屬性的影響。也就是說當你使用了一張自定義圖片做爲navigationBar的背景圖時,translucent的值將由系統根據該圖片是否顏色值透明,來推斷translucent是YES or NO。圖片
因而坑就來了:對於導航控制器中的各個childViewController,是共用同一個的navigationBar。當你在一個childViewController中自定義了navigationBar的背景圖片,或是直接改變了translucent屬性,此時再push或pop到另外一個childViewController時,更改導航欄的半透明效果可能會影響到頁面的佈局起始位置,從而發生視圖發生跳動,出現「意外」的上下偏移。文檔
舉個例子:從一個設置了導航欄不透明的控制器A,pop回到一個本來設置了導航欄透明的控制器B時,B頁面發生了下移。io
爲避免該狀況,應該將控制器B的extendedLayoutIncludesOpaqueBars設置爲YES;或是當B頁面viewWillAppear:時,再度將導航欄設置爲半透明效果。table
至於automaticallyAdjustsScrollViewInsets屬性,系統默認值爲YES。意味着當導航控制器的childViewController.view的上層視圖爲scollView類簇時,則系統會自動爲該scrollView的contentInset(內邊距屬性)的Top值增長額外的64
,因而內容就會下移64
。class
以tableView爲例,當你使用默認的建立方式,也就是UIRectEdgeAll+導航欄半透明的狀況下,首行cell的位置將處於導航欄下方,也就是屏幕座標系的
(0, 64)
位置處,此時上滑將會造成穿透效果導航欄的效果。scroll
補充:當你的設計中出現導航欄穿透效果
,自定義非透明的導航欄背景
、導航欄徹底透明
等需求時,記得結合上述幾點進行判斷處理,避免發生預想以外的界面誤差。call