1. 現(xiàn)象
在使用tableview的時(shí)候,你是否遇到下面的問題泽铛,如下圖左邊缘挽,將一個(gè)tableview加入到self.view中,設(shè)置其frame的y值為導(dǎo)航欄家狀態(tài)欄高度64员串,self.view的背景色為紅色勇哗,tableview的背景色為黃色,tableviewcell的背景色為綠色寸齐。
運(yùn)行的結(jié)果是:tableview的cell并沒有從tableview的頂部開始欲诺,為什么為出現(xiàn)這種情況,我們并沒有設(shè)置headerview懊祓小扰法?
同樣的設(shè)置,在UIScrollview中也是相同的結(jié)果毅厚,如下圖右塞颁。其中灰色view的frame為0,0,100祠锣,100.
2. 分析
至于為何會(huì)發(fā)生上面的情況酷窥,本人還沒有弄清楚,但是解決方法是有的锤岸,而且很簡(jiǎn)單竖幔。UIScrollview有個(gè)contentInset屬性,大家都知道吧是偷,UItableview繼承自它拳氢,也有該屬性,上面的情況是不是很像給其其屬性賦值了(64蛋铆,0馋评,0,0)刺啦。
我們打印tableview和scrollview的contentinset之后留特,的確如此:
{64, 0, 0, 0}
3. 解決方法
3.1 contentinset=uiedgeinsetzero
所以解決方法就是,人為的改變其contentinset=uiedgeinsetzero玛瘸。但是需要注意的是蜕青,該代碼寫的位置是有講究的,我所寫的這個(gè)demo糊渊,該行代碼寫在viewWillAppear里面是無效的右核。也就是說,盡管在viewwillappear里面設(shè)置其contentinset為UIedgeinsetzero渺绒,但是在viewdidappear里面打印的結(jié)果仍然是{64贺喝,0,0宗兼,0)躏鱼。
而在viewdidappear和viewdielayout里面設(shè)置該屬性后,就可以達(dá)到想要的結(jié)果殷绍,而且在viewdidappear里面打印的該屬性的確是{0染苛,0,0主到,0}殖侵。
因?yàn)楸救说臏y(cè)試并不系統(tǒng),上面的結(jié)果不能算是一個(gè)確切的結(jié)論镰烧,因?yàn)槲覀儾徊荒艽_定出現(xiàn)這樣的現(xiàn)象到底是有什么因素決定的。
針對(duì)該代碼的位置的問題楞陷,個(gè)人猜測(cè)這個(gè)和view的布局時(shí)機(jī)有關(guān)怔鳖。
下圖是設(shè)置后的效果:
3.2 self.automaticallyAdjustsScrollViewInsets = NO;
這里的self指的是當(dāng)前controller,從該屬性字面就可以看出固蛾,禁用其自動(dòng)調(diào)整scrollview的inset屬性结执。
同樣該代碼的位置也是有講究的:放在viewdidload和viewwillappear里面是有效的度陆,而放在viewWillLayoutSubviews 和 viewdidlayoutsubviews 以及 viewdidAppear里面是無效的。
3.3 self.navigationController.navigationBar.translucent = NO;
從字面意思看献幔,該屬性設(shè)置的是navigationBar的透明屬性懂傀,默認(rèn)是YES,設(shè)置為NO后蜡感,就出現(xiàn)下面圖中的現(xiàn)象:
scrollview的contentinset恢復(fù)為zero了蹬蚁,但是self.view(紅色的view)距離navigationbar有64的間隙。也就是說navigationbar的透明屬性去掉后郑兴,self.view從navigationBar的底部開發(fā)布局了犀斋,這其實(shí)和iOS6到iOS7之后蘋果的一個(gè)改進(jìn)(這個(gè)是面試經(jīng)常被問到的)。
可以看出雖然消除了scrollview的contentinset情连,但是self.view的位置也想要的改變了叽粹,所以在使用的時(shí)候要慎重。
同樣却舀,改代碼的位置也是有講究的虫几,在viewdidLoad 和 viewwillappear里面有效,在viewwilllayoutsubviews viewdidlayoutsubviews viewdidappear里面無效挽拔。
4. 總結(jié)
- 有三種方法可以解決上述問題
- 三種方法代碼的位置有講究
- 本demo并不科學(xué)辆脸,不系統(tǒng),所以得出的結(jié)論并不一定正確
- 該現(xiàn)象什么情況下出現(xiàn)篱昔,或者其受什么因素影響每强,本人并不清楚,如有哪位童鞋知道州刽,歡迎告知空执。
- 好像還有其它方法可以解決該問題,本人并沒有做過測(cè)試穗椅,可以參考下面的鏈接辨绊。