UITableViewController佈局 消除頂部空白

1. 現象

在使用tableview的時候,你是否遇到下面的問題,以下圖左邊,將一個tableview加入到self.view中,設置其frame的y值爲導航欄家狀態欄高度64,self.view的背景色爲紅色,tableview的背景色爲黃色,tableviewcell的背景色爲綠色。
運行的結果是:tableview的cell並無從tableview的頂部開始,爲何爲出現這種狀況,咱們並無設置headerview啊?
一樣的設置,在UIScrollview中也是相同的結果,以下圖右。其中灰色view的frame爲0,0,100,100.面試

屏幕快照 2016-01-09 下午4.17.47.pngapp

2. 分析

至於爲什麼會發生上面的狀況,本人尚未弄清楚,可是解決方法是有的,並且很簡單。UIScrollview有個contentInset屬性,你們都知道吧,UItableview繼承自它,也有該屬性,上面的狀況是否是很像給其其屬性賦值了(64,0,0,0)。
咱們打印tableview和scrollview的contentinset以後,的確如此:
{64, 0, 0, 0}佈局

3. 解決方法

3.1 contentinset=uiedgeinsetzero

因此解決方法就是,人爲的改變其contentinset=uiedgeinsetzero。可是須要注意的是,該代碼寫的位置是有講究的,我所寫的這個demo,該行代碼寫在viewWillAppear裏面是無效的。也就是說,儘管在viewwillappear裏面設置其contentinset爲UIedgeinsetzero,可是在viewdidappear裏面打印的結果仍然是{64,0,0,0)。
而在viewdidappear和viewdielayout裏面設置該屬性後,就能夠達到想要的結果,並且在viewdidappear裏面打印的該屬性的確是{0,0,0,0}。
由於本人的測試並不系統,上面的結果不能算是一個確切的結論,由於咱們不不能肯定出現這樣的現象究竟是有什麼因素決定的。
針對該代碼的位置的問題,我的猜想這個和view的佈局時機有關。
下圖是設置後的效果:測試

Simulator Screen Shot 2016年1月9日 下午4.38.05.pngui

3.2 self.automaticallyAdjustsScrollViewInsets = NO;

這裏的self指的是當前controller,從該屬性字面就能夠看出,禁用其自動調整scrollview的inset屬性。
一樣該代碼的位置也是有講究的:放在viewdidload和viewwillappear裏面是有效的,而放在viewWillLayoutSubviews 和 viewdidlayoutsubviews 以及 viewdidAppear裏面是無效的。spa

3.3 self.navigationController.navigationBar.translucent = NO;

從字面意思看,該屬性設置的是navigationBar的透明屬性,默認是YES,設置爲NO後,就出現下面圖中的現象:
scrollview的contentinset恢復爲zero了,可是self.view(紅色的view)距離navigationbar有64的間隙。也就是說navigationbar的透明屬性去掉後,self.view從navigationBar的底部開發佈局了,這其實和iOS6到iOS7以後蘋果的一個改進(這個是面試常常被問到的)。
能夠看出雖然消除了scrollview的contentinset,可是self.view的位置也想要的改變了,因此在使用的時候要慎重。
一樣,改代碼的位置也是有講究的,在viewdidLoad 和 viewwillappear裏面有效,在viewwilllayoutsubviews viewdidlayoutsubviews viewdidappear裏面無效。.net

Simulator Screen Shot 2016年1月9日 下午4.46.24.png繼承

相關文章
相關標籤/搜索