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继承

相关文章
相关标签/搜索