我有一个UITableView有两个部分.这是一个简单的表格视图.我正在使用viewForHeaderInSection为这些标头创建自定义视图.到现在为止还挺好.
默认滚动行为是当遇到一个部分时,部分标题保持锚定在导航栏下方,直到下一部分滚动到视图中.
我的问题是:我可以更改默认行为,以便节标题不会停留在顶部,而是在导航栏下滚动剩下的部分行吗?
我错过了一些明显的东西吗
谢谢.
我解决了这个问题的方式是,调整contentOffset
根据contentInset
在UITableViewControllerDelegate
(延伸UIScrollViewDelegate
)所示:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = 40; 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); } }
这里唯一的问题是当滚动回到顶部时它会失去一点反弹.
{注意:"40"应该是你的0部分标题的确切高度.如果您使用的数字大于第0部分标题高度,您会看到手指感觉受到影响(尝试"1000",您会看到反弹行为在顶部有点奇怪).如果数字符合你的0部分标题高度,手指感觉似乎是完美的或接近完美的.}
您还可以在顶部添加一个零行的部分,只需使用上一部分的页脚作为下一部分的标题.
如果我这样做,我会利用以下事实:Plain样式中的UITableViews具有粘性标题,而Grouped样式中的UITableViews则没有.我可能至少尝试使用自定义表格单元来模拟Grouped表格中Plain单元格的外观.
我实际上没有尝试过,所以它可能无法正常工作,但这就是我建议做的事情.
我知道它来得很晚,但我找到了最终的解决方案!
你想要做的是如果你有10个部分,让dataSource返回20.对部分标题使用偶数,对部分内容使用奇数.这样的事情
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section%2 == 0) { return 0; }else { return 5; } } -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (section%2 == 0) { return [NSString stringWithFormat:@"%i", section+1]; }else { return nil; } }
瞧!:d
以非hacky方式解决此问题需要做几件事:
将表视图样式设置为 UITableViewStyleGrouped
将表视图设置backgroundColor
为[UIColor clearColor]
将backgroundView
每个表视图单元格设置为空视图backgroundColor [UIColor clearColor]
如有必要,请相应地设置表视图rowHeight
,或者tableView:heightForRowAtIndexPath:
在各个行具有不同高度时覆盖.
最初发布在这里,使用IB的快速解决方案.虽然非常简单,但可以通过编程方式完成.
一种可能更容易实现的方法(使用IB):
将UIView拖到TableView上,使其成为标题视图.
将标题视图高度设置为100px
将tableview contentInset(顶部)设置为-100
现在,节标题将像任何常规单元格一样滚动.
有人评论说这个解决方案隐藏了第一个标题,但是我没有注意到任何这样的问题.它对我来说非常合适,是迄今为止我见过的最简单的解决方案.
到目前为止,我对这里描述的解决方案不满意,所以我试着将它们结合起来.结果是以下代码,受@awulf和@cescofry的启发.它适用于我,因为我没有真正的表视图标题.如果您已有表格视图标题,则可能需要调整高度.
// Set the edge inset self.tableView.contentInset = UIEdgeInsetsMake(-23.0f, 0, 0, 0); // Add a transparent UIView with the height of the section header (ARC enabled) [self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 23.0f)]];
只需更改TableView样式:
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
UITableViewStyle文档:
UITableViewStylePlain-普通表视图.任何节页眉或页脚都显示为内联分隔符,并在滚动表视图时浮动.
UITableViewStyleGrouped-一个表视图,其截面显示不同的行组.节标题和页脚不会浮动.
从故事板中的tableView的Attribute Inspector中选择Grouped Table View样式.
使用透明视图设置表的headerView,并在剖面视图中设置标题的高度。还要使用-height框架初始化tableview。
self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, - height, 300, 400)]; UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)] autorelease]; [self.tableView setTableHeaderView:headerView];
更改TableView样式:
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
根据UITableView的苹果文档:
UITableViewStylePlain-普通表视图.任何节页眉或页脚都显示为内联分隔符,并在滚动表视图时浮动.
UITableViewStyleGrouped-一个表视图,其截面显示不同的行组.节标题和页脚不会浮动.希望这个小改变能帮到你..