UITableView viewForFooterInSection 仅在滚动后显示
Posted
技术标签:
【中文标题】UITableView viewForFooterInSection 仅在滚动后显示【英文标题】:UITableView viewForFooterInSection only shows after scrolling 【发布时间】:2015-05-14 20:58:59 【问题描述】:我有一个 UITableView,它有一个部分和足够的行,tableView 需要滚动到底部。我想添加一个页脚视图,它会粘在 tableView 的底部并且始终可见,所以我实现了 viewForFooterInSection。这是我的代码:
- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
NSLog(@"Get footer view");
if (tableView == [self tableView])
return [self footerRowRightView];
else if (tableView == [self fixedColumnTableView])
return [self footerRowLeftView];
return nil;
我遇到的问题是页脚视图仅在 tableView 滚动后显示,但我希望它从一开始就可见(即无论用户滚动与否始终浮动)。
一旦控制器出现并且 tableView 加载其数据,我会在日志中看到“获取页脚视图”,因此我知道 viewForFooterInSection 正在被立即调用。我无法解决的是为什么它没有立即显示,以及如何让它这样做。
提前感谢您的帮助!
【问题讨论】:
您是如何创建footerRowRightView
和footerRowLeftView
的?如果它们基于 UITableViewCell,则将它们用于页眉和页脚时会出现问题。您必须返回 contentView
而不是单元格。
@RoryMcKinnel - 它们是在 viewDidLoad 期间创建的 UIView。
您是否检查过heightForFooterInSection:
最初返回的合理高度?
@RoryMcKinnel - 我不敢相信。我确实记录了这个以检查他们是否返回了正确的高度,但再次检查后我意识到我愚蠢地实现了 estimatedHeightForFooterInSection:。当我将它们更改为 heightForFooterInSection 的实现时,一旦 tableView 出现,页脚就开始出现。谢谢!!!如果您将此作为答案发布,我会接受。
很高兴你被排序。发布了接受的答案。谢谢。
【参考方案1】:
这可能是您的页脚没有正确返回的高度。
检查您从heightForFooterInSection
返回的内容
【讨论】:
谢谢!!!正如我在上面的评论中所说,我错误地实现了 estimatedHeightForFooterInSection:。将其更改为 heightForFooterInSection 后,现在一切都按预期工作。谢谢!【参考方案2】:您需要的不是 tableview 的页脚。
只需在你的tableview的superview中添加这个header对应的view,放在它的底部即可。然后只需降低 tableview 框架的高度以适应剩余空间。它应该这样做!
【讨论】:
谢谢@KIDdAe。这样做的问题是,如果用户滚动到最后一行之后,视图不会停留在最后一行的底部。如果使用 viewForFooterInSection 无法实现我想要的,那么我将按照您的方式实现并实现 scrollViewDidScroll:,如果滚动位置超过 tableView 内容的垂直大小,则调整页脚视图的 y 偏移量。我宁愿避免这种情况,所以在将你的答案标记为正确之前,我会等着看是否有办法用 tableViewFooter 实现我想要的。再次感谢! @mashley 确实有点难。使用滚动偏移来计算页脚位置可以做到这一点。另一种解决方案可能是在滚动视图中添加表格视图(并删除表格视图上的滚动),并在滚动应该反弹时将页脚添加为此滚动视图的子视图,如果没有,则将其添加到其父视图中。 如果我移除 tableView 上的滚动并将其放入容器 UIScrollView 中,tableView 会一次加载所有行还是仅在滚动到视图时才加载行? 我会试试的。如果我在 cellForRowAtIndexPath 中放置一个 NSLog,我可以计算它记录的次数并与数据源中的行数进行比较。【参考方案3】:如果要粘贴页脚,则不能使用页脚视图。或者尝试使用分组表视图。
【讨论】:
【参考方案4】:从其他答案的外观来看,有很多选择。只是为了添加我刚刚提出的一个 hacky 解决方法,我创建了我将用作页脚的视图的副本,并将它们添加为我的主视图的子视图,正好放置在真正的页脚视图的位置上。视图保留在属性中,因此在 scrollviewDidScroll 中我可以执行以下操作:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if ([self preScrollFooterLeftView])
[[self preScrollFooterLeftView] removeFromSuperview];
if ([self preScrollFooterRightView])
[[self preScrollFooterRightView] removeFromSuperview];
这样,页脚似乎会立即显示。一旦用户滚动 tableView,假页脚就会被删除,显示它下面的真实页脚。如果 tableView 滚动到最后一行下方,则真正的 header 会粘在该部分的底部,并在用户松开时弹回 tableView 的底部。
【讨论】:
以上是关于UITableView viewForFooterInSection 仅在滚动后显示的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView
如何与重叠显示的 UITableView 交互另一个 UITableView