影響界面佈局的相關屬性

Property Class
edgesForExtendedLayout UIViewController
extendedLayoutIncludesOpaqueBars UIViewController
automaticallyAdjustsScrollViewInsets UIViewController
translucent NavigationBar
  1. edgesForExtendedLayout屬性的系統默認值爲UIRectEdgeAll:意味着當導航控制器的導航欄爲半透明效果時,子控制器self.view佈局的起始位置將從屏幕邊緣左上角開始。佈局

  2. extendedLayoutIncludesOpaqueBars屬性系統默認爲NOOpaque表明非透明,not Includes意味着導航欄不是半透明時,即使當前是UIRectEdgeAllself.view的佈局起始位置依舊是從導航欄下方開始。設計

  3. translucent屬性值會決定導航欄是否有半透明效果。translucentNO,意味着導航欄爲非透明,此時如上文所述,即使當前是UIRectEdgeAll,因爲extendedLayoutIncludesOpaqueBars爲默認NOself.view的佈局起始位置依舊是從導航欄下方開始。
    須要特別注意的是:code

    根據官方文檔所述:translucent會受navigationBar的backgroudImage屬性的影響。也就是說當你使用了一張自定義圖片做爲navigationBar的背景圖時,translucent的值將由系統根據該圖片是否顏色值透明,來推斷translucent是YES or NO。圖片

因而坑就來了:對於導航控制器中的各個childViewController,是共用同一個的navigationBar。當你在一個childViewController中自定義了navigationBar的背景圖片,或是直接改變了translucent屬性,此時再pushpop到另外一個childViewController時,更改導航欄的半透明效果可能會影響到頁面的佈局起始位置,從而發生視圖發生跳動,出現「意外」的上下偏移。文檔

舉個例子:從一個設置了導航欄不透明的控制器A,pop回到一個本來設置了導航欄透明的控制器B時,B頁面發生了下移。io

爲避免該狀況,應該將控制器B的extendedLayoutIncludesOpaqueBars設置爲YES;或是當B頁面viewWillAppear:時,再度將導航欄設置爲半透明效果。table

  1. 至於automaticallyAdjustsScrollViewInsets屬性,系統默認值爲YES。意味着當導航控制器的childViewController.view的上層視圖爲scollView類簇時,則系統會自動爲該scrollViewcontentInset(內邊距屬性)的Top值增長額外的64,因而內容就會下移64class

    tableView爲例,當你使用默認的建立方式,也就是UIRectEdgeAll+導航欄半透明的狀況下,首行cell的位置將處於導航欄下方,也就是屏幕座標系的(0, 64)位置處,此時上滑將會造成穿透效果導航欄的效果。scroll

補充:當你的設計中出現導航欄穿透效果自定義非透明的導航欄背景導航欄徹底透明等需求時,記得結合上述幾點進行判斷處理,避免發生預想以外的界面誤差。call

相關文章
相關標籤/搜索