UITableViewStyleGrouped类型的UITabe
我们知道使用UITableView的时候有个技巧:使用table.tableFooterView = [UIView new];一行代码可以解决UITableView在cell比较少的情况下不显示下面的分割线条How to remove empty cells in UITableView? 。
今天在使用UITableViewStyleGrouped类型的UITableView的时候又发现一个小技巧。
当设置UITableView为UITableViewStyleGrouped的时候,下面两段代码将导致不同的界面效果:
方式1:
table = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
table.backgroundColor = [UIColor clearColor];
table.separatorColor = kLineColor;
table.tableFooterView = [UIView new];
table.delegate = self;
table.dataSource = self;
方式1的效果图:
方式1效果图.png方式2:
table = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
table.backgroundColor = [UIColor clearColor];
table.separatorColor = kLineColor;
table.delegate = self;
table.dataSource = self;
table.tableFooterView = [UIView new];
方式2的效果图:
方式2的效果图.png前提条件:
-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section
{
return 10.f;
}
-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section
{
return 0.01f;
}
我们看到代码顺序不同直接导致了界面显示不同。我们看到第一种情况,这什么鬼?
问题1:如何调整第一个section header 的默认高度
我相信肯定有不少人遇到过这种情况---怎么修改UITableViewStyleGrouped类型的UITableView的第一个sction header的默认高度?,然后网上各种搜怎么解决UITableViewStyleGrouped类型的UITableView的第一个section header的高度问题,然后你会搜到这种解决方案:
table.contentInset = UIEdgeInsetsMake(-25, 0, 0, 0);通过这行代码来将UITableView的第一个section header隐藏一部分上去。
通调整可以看到下面的效果,会比之前好多了,但是在实际使用过程中要达到精确的section header 高度,需要多次调整contentInset来看效果,颇为麻烦。
效果图.png问题2:如何改变默认section footer 默认高度
在stackoverflow上面会有人告诉你,可以通过以下设置比0稍微大一点点的方式来改变section footer的高度。
-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section
{
return 0.01;
}
见:How to change height of grouped UITableView header?
How to hide first section header in UITableView (grouped style)
总结:
在使用UITableViewStyleGrouped类型UITableView的时候,要想去掉头部默认高度,建议使用以下代码:
table = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
table.backgroundColor = [UIColor clearColor];
table.separatorColor = kLineColor;
table.delegate = self;
table.dataSource = self;
table.tableFooterView = [UIView new];
//同理,tableHeaderView也应该在设置代理之后赋值
以及:
-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section
{
return 10.f;
}
-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section
{
return 0.01f;
}
具体为什么table.tableFooterView = [UIView new];与
table.delegate = self;
table.dataSource = self;
顺序颠倒会导致UITableViewStyleGrouped类型UITableView的效果造成不一样的影响,对UITableViewStylePlain类型的UITableView却没有什么影响,看苹果官方文档中,对tableFooterView也没有做很详细的说明,我猜测是UITableViewStyleGrouped类型UITableView在runtime中做了特殊处理。
相比之下,第二种代码实现的方式更简单明了,只需要注意代码顺序即可。在前期没发现第二种实现方法,导致一直按照第一种方式折腾了好久,走了不少弯路,特做此记录,转载请注明出处。
2016-09-06更新
感谢 HYY在第七楼分享的更加直接粗暴的方法:
table.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];
来实现去掉UITableViewStyleGrouped类型UITableView头部高度,但是为了调整分区之间的间距还是需要实现heightForFooterInSection方法的。