我有一个带有两个部分的UITableView,它是一个简单的表格视图。我正在使用viewForHeaderInSection为这些标题创建自定义视图。到目前为止都很好。
默认的滚动行为是,当遇到一个部分时,部分标题会保持在Nav栏下方固定,直到下一个部分滚动到视图中。
我的问题是:我是否可以更改默认行为,使部分标题不会固定在顶部,而是随着其余部分行一起在导航栏下方滚动?
我是否忽略了一些明显的内容?
谢谢。
我有一个带有两个部分的UITableView,它是一个简单的表格视图。我正在使用viewForHeaderInSection为这些标题创建自定义视图。到目前为止都很好。
默认的滚动行为是,当遇到一个部分时,部分标题会保持在Nav栏下方固定,直到下一个部分滚动到视图中。
我的问题是:我是否可以更改默认行为,使部分标题不会固定在顶部,而是随着其余部分行一起在导航栏下方滚动?
我是否忽略了一些明显的内容?
谢谢。
我解决这个问题的方法是在UITableViewControllerDelegate
(扩展了UIScrollViewDelegate
)中根据contentInset
调整contentOffset
,代码如下:
- (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 部分标题高度相匹配,则手感似乎完美或接近完美。}
tableView.bounce = NO
。 - nitish005您还可以在顶部添加一个零行的区域,然后简单地使用上一部分的页脚作为下一部分的页眉。
如果是我来做这个,我会利用UITableView的Plain样式具有粘性表头的特点,而Grouped样式没有。我可能会尝试使用自定义的表格单元格来模仿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
UITableView
上效果不佳。 - kubi这是一个关于编程的快速解决方案,最初在这里发布,可以使用IB(Interface Builder)来实现。虽然也可以通过编程轻松地完成相同的操作。
一种可能更简单的方法(使用IB):
将UIView拖动到您的TableView上,以使其成为标题视图。
- 将该标题视图高度设置为100px
- 将tableview contentInset(顶部)设置为-100
- 现在,部分标题将像任何常规单元格一样滚动。
有些人评论说,这种解决方案会隐藏第一个标题,但我没有注意到任何此类问题。对我来说,它完美地工作,并且是迄今为止我看到的最简单的解决方案。
解决这个问题需要完成几件事情,而且要以非 hacky 的方式完成:
UITableViewStyleGrouped
[UIColor clearColor]
backgroundView
设置为空视图,并设置其背景颜色为 [UIColor clearColor]
tableView:heightForRowAtIndexPath:
UITableViewStyleGrouped
,表格单元格有额外的边距,这会改变它们与标题的对齐方式。当您想要描绘一个多列表并使用标题显示列标题(然后使各个表条目与这些标题对齐)时,这是一个问题。 - brainjam// 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];
UITableViewStylePlain- 普通的表格视图。任何部分的头部或尾部都会显示为内联分隔符,并在滚动表格视图时浮动。
UITableViewStyleGrouped- 表示具有不同行组的明显组的表格视图。节标题和页脚不会漂浮。
使用与 section header 高度相同的透明视图来设置表格的表头视图(headerView)。同样,将tableview的y frame初始化为-height。
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];