UITableview布局 消除顶部空白contentInset

转载 2016年04月22日 11:07:02

UITableview布局 消除顶部空白contentInset


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.png

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.png

3.2 self.automaticallyAdjustsScrollViewInsets = NO;

这里的self指的是当前controller,从该属性字面就可以看出,禁用其自动调整scrollview的inset属性。
同样该代码的位置也是有讲究的:放在viewdidload和viewwillappear里面是有效的,而放在viewWillLayoutSubviews 和 viewdidlayoutsubviews 以及 viewdidAppear里面是无效的。

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里面无效。


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

4. 总结

  1. 有三种方法可以解决上述问题
  2. 三种方法代码的位置有讲究
  3. 本demo并不科学,不系统,所以得出的结论并不一定正确
  4. 该现象什么情况下出现,或者其受什么因素影响,本人并不清楚,如有哪位童鞋知道,欢迎告知。
  5. 好像还有其它方法可以解决该问题,本人并没有做过测试,可以参考下面的链接。

    5. 参考

  6. ios7 下 UINavigationController挡住下面的内容
  7. 发现了在IOS7下一个问题,不知大家有没有遇到

UITableView的UITableViewStyleGrouped风格顶部空白问题

在使用UITableView的UITableViewStyleGrouped的属性时,会遇到每组的顶部空白如图1; 处理方法:设置UITableView的两个代理就可以解决: // 解决方法:...
  • lining1041204250
  • lining1041204250
  • 2016年11月17日 14:18
  • 1337

iOS 11 tableView顶部多出一片空白区域

苹果向来都是出个bug让开发者填坑,这不弄了个iPhone X的异形屏幕,既要考虑顶部的齐刘海,又要考虑底部的home条。现在不光是iPhone X的屏幕问题,iOS 11的SDK也有好多改变,其中影...
  • youshaoduo
  • youshaoduo
  • 2017年10月25日 11:29
  • 3863

iOS11 Tableview顶部空白和Section Header留白问题

iOS11上废除了automaticallyAdjustsScrollViewInsets这个方法,所以造成iOS11机型顶端留白问题 解决方法: if (@available(iOS 11...
  • leonliu070602
  • leonliu070602
  • 2017年11月20日 13:15
  • 1578

iOS UITableview cell 顶部空白区的去除

遇到的问题: 当在一个控制器UIViewController中添加 UITableView,自定义的cell,会发现cell上面会有一个无用的白色区域。 原因: iOS7在Conttoller中新...
  • fucuiping_1314
  • fucuiping_1314
  • 2016年09月19日 16:40
  • 1450

IOS:tableView顶部留有空白的学习

1.问题描述:今天写一个tableView的时候偶然发现tableView的顶部留有空白,也就是cell不是在tableView的顶部显示。如下图: 上图是头部留有空白的情况(红色是tabl...
  • u011103194
  • u011103194
  • 2015年12月21日 16:34
  • 3026

详解iOS开发中UITableview cell 顶部空白的多种设置方法

我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况:    self.automaticallyAdjustsScrollViewInsets = NO; iOS7...
  • qq_19963691
  • qq_19963691
  • 2017年09月12日 11:43
  • 403

iOS开发Storyboard中UITableView顶部默认空白 - 芒果iOS

【主要内容:】 1. 问题描述 2. 问题分析 3. 解决问题办法 一、问题描述 前两天开发的时候在StoryBoard中创建了一个UITableView,但是拖...
  • CrazyZhang1990
  • CrazyZhang1990
  • 2017年02月27日 17:01
  • 682

ios UITableView去掉上面的空白

//----------这三行可消除tableview空白---------- - (CGFloat)tableView:(UITableView *)tableView heightForHeade...
  • dujianjunqwer
  • dujianjunqwer
  • 2018年04月09日 10:18
  • 4

TableView覆盖状态栏

Since we’ve switched over to a plain table view, let’s fix the top edge offset, too, by adding some ...
  • zhang31jian
  • zhang31jian
  • 2015年11月12日 10:58
  • 3646

关于静态cell实现tableView顶部与状态栏顶部平齐的问题

最近开发的app有个我的页面需要用到静态cell来做,因为这个页面基本不改动,用静态cell简单方便,需求如下图所示,并且有4个section,组和组之间还有一个间隔 tableView的顶部是...
  • youMN
  • youMN
  • 2016年01月22日 22:09
  • 2651
收藏助手
不良信息举报
您举报文章:UITableview布局 消除顶部空白contentInset
举报原因:
原因补充:

(最多只允许输入30个字)