昨天在项目中遇到一个关于tableView的headerView不能随着cell一起滚动,必须要下一组headerView才能顶上去的问题.
百度上也有很多人遇到这个问题 解决的方式大部分都是监听滚动:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat sectionHeaderHeight = 50;
if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y> 0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
}else
if(scrollView.contentOffset.y >= sectionHeaderHeight){
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
这个方法我也测试了下有BUG 滚动的时候不流畅headerView会闪一下并且如果你的tableview的cell铺不满整个屏幕的时候有弹簧效果的时候滑上去之后就下不来了,苦恼很久突然想到以前也写过一个这种分组的tableView,记得不会出现这个问题的,代码是这样写的:
self.switchTableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStyleGrouped];
[self.view addSubview:self.switchTableView];
现在的项目是用masonry写约束的所以创建tableView的时候没有用到initWithFrame: style:这个方法:
self.memberTableView = [[UITableView alloc]init];
但是用initWithFrame: style:这个创建方法必须要传个frame怎么办?其实很简单传个CGRectZero就好了 代码如下:
self.memberTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
[self.view addSubview:self.memberTableView];
[self.memberTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
但是这个方法会在每一组的头部加上一个空白组头部和底部所以必须再实现一个方法
self.memberTableView.tableHeaderView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGFLOAT_MIN, CGFLOAT_MIN)];
self.memberTableView.tableFooterView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGFLOAT_MIN, CGFLOAT_MIN)];
同时这个方法也会当tableView占不满一屏时,去除下边多余的单元格
如果你的tableview没有footView的时候最好把高度写成0.001.
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.001;
}
所以只要确定创建的tableView的样式是UITableViewStyleGrouped 然后将footView的时候最好把高度写成0.001 tableHeaderView,tableFooterView改成最小 headerView滑动的时候就不会卡在顶部了.
希望下次有遇到跟我一样的问题的人,少走点弯路.