在有的時候,當一個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或者他的子類的時候只會調整他們其中的一個。
所以具體怎么使用,還是看每個人的需要。