在使用NavigationController情況下的布局的Y軸的起始位置


在有的時候,當一個ViewController被push進一個NavigationController的時候,view上會有一個高度為64的NavigationBar(除非主動隱藏了NavigationBar)。

那么在ViewController的view上布局的時候,Y軸的起始位置是從 Y=0 開始,還是Y=64?

這兩種的情況都是會出現的,那么起始位置什么時候是0什么時候又是64呢?

首先創建一個ViewController的方法一般有三種:

  1.純代碼創建

  2.Xib創建

  3.在stroyboard上創建

  

位置是0開始還是64,其實取決於,你往view添加的組件是什么,是UIScrollView或者UIScrollView的子類還是其他的組件。

 

(一)首先往view上添加一個跟UIScrollview 沒有關系的組件(以button為例)

  如果使用的是storyboard來布局的話,這個問題會相對簡單點。因為在storyboard上被壓入的ViewController會自動顯示NavigationBar的位置

這樣布局的時候自然而然的會從NavigationBar的下面開始布局,也就是Y=64,比如往上面拖一個button

這樣這個button是正常顯示的,不會被NavigationBar遮住,此時button的Y軸是64。所以基本可以肯定,如果使用代碼寫的組件也是需要從Y=64的位置開始布局。其實在storyBoard中如果將這個button繼續向上托的話,這個button就會添加到Navigationbar上了。

(1)當Y=0的時候

在這種情況下,button是被NavigationBar遮住的

(2)當Y=64的時候

在Y=64的情況是正常的

(二)現在往view上添加UIScrollView的子類UITableView

還是現在storyboard上直接拖一個TableView,TableView的其實位置也放在NavigationBar的下面也就是Y = 64,。

結果在模擬器上運行的結果卻和往上面添加button是不一樣的

可以看出來TableView往下移,是不是TableView的Y軸位置往下移了呢?

給TableView設置一個邊框發現其實並不是的TableView的Y軸位置還是64

那是是不是TableView的contentOffset發生了變化呢?於是分別在viewDidLoad,viewWillAppear,ViewDidAppear的時候打印TableView的contentOffset

 發現在viewDidAppear的時候TableView的contentOffset的Y是發生64的偏移。如果使用的ScrollView的話,情況也是一樣的,在ScrollView上添加的組件都是會向下發生64的偏移。

所以按照這個情況來說那么Scrollview以及他的子類在布局的時候Y軸不是從64開始而是0,測試一下果然如此

現在看上去內容的位置是對了,但是實際上TableView還是被NavigationBar遮住了64大小的位置,但是因為內容自動往下偏移了64,所以才出現了這樣的效果

(3)那如果view上既有tableView又有其他組件又是什么情況呢?

現在再往view上放一個button,給他的默認位置為64

跑一遍模擬器看看

從模擬器的結果看來位置都是正確的,看來在布局的時候TableView和button的不會相互影響的。這樣的話,如果button的Y軸變成0的話,那么他應該會被NavigationBar遮住

跑一遍模擬器,果然是這樣。

在布局的時候如果使用了NavigationController的時候他會對ScrollView以及他的子類進行一個修正,也就是把他的contentOffset向下偏移64,所以布局的時候除了ScrollView以及他子類之外的其他控件都需要從Y=64開始布局。其實在viewController中有一個屬性叫做automaticallyAdjustsScrollViewInsets, 這個屬性官方的解釋簡單的說就是ViewController會根據status Bar、NavigationBar、tabBar的高度對ScrollView的內容的為做出相應的調整,這個屬性是IOS7.0以后的才有的。默認情況下這個屬性是YES。所以在上面的TableView出現了內容下移的現象,如果想將TableView的Y軸設置從64開始,並且內容不發生偏移的話,將automaticallyAdjustsScrollViewInsets屬性設置為NO就可以了。

 

(4)如果有兩個或者多個的ScrollView或者他的子類的時候又是什么情況呢?

 在視圖控制器上放兩個TableView,將他們的Y其實位置都設置為64,那是不是這兩個TableView的內容都會下移64呢?

模擬器跑下來卻不是的

一個TableView的內容被自動下移了,另一個並沒有,再試試放三個TableView試試

還是一樣一個內容偏移了,其他的並沒有。這說明automaticallyAdjustsScrollViewInsets是起來作用的,但是只在一個TableView上用,如果把automaticallyAdjustsScrollViewInsets設置為NO又是什么情況呢?

 

可以看出來第一個TableView的內容不再偏移了,所以automaticallyAdjustsScrollViewInsets在有個多個ScrollView或者他的子類的時候只會調整他們其中的一個。

 

所以具體怎么使用,還是看每個人的需要。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM