我将UITableView配置为普通样式,因此我可以将标题视图粘贴在表格的顶部,直到另一个标题将其拉出。
问题是:如果我的屏幕顶部有一个标题,并且我以编程方式滚动到表格的另一部分(该标题根本不应出现),那么UIView将不会被解雇。即如果我再次滚动到表格的那一部分,那个表格的部分就会显示该标题的幽灵。
我已经实施了方法- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(nonnull UIView *)view forSection:(NSInteger)section
来了解正在发生的事情。我发现如果我手动滚动直到标题被拉开屏幕,则会调用此委托。但是如果我以编程方式滚动,则不会调用该委托。
顺便说一句,我尝试使用两种不同的方法以编程方式滚动,问题是一样的。
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
我可以想象的一个解决方法是实现- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
,过滤掉可见屏幕之外的所有标题视图,并从superview中删除它们。我可以让它工作,但我想知道是否还有其他更好的解决方案。
[编辑]如果我用动画= YES调用- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
,则不会发生错误。我可以使用这个解决方案,但我真的希望在某些情况下滚动没有动画。
答案 0 :(得分:1)
我不完全确定我完全理解您的问题,但是一旦您以编程方式滚动离开此区域/部分并且那么您的标题视图(某些UIView
)似乎无法正确呈现返回。
我不确定你是如何填充标题视图内容的,但我有几个运行UITableView
的应用程序,其中有多个节标题需要更新滚动/内容偏移量而没有问题只要您使用此委托“绘制”您的标题:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
// Per section, simply return the appropriate header view
...
NSString *someIdentifier = [NSString stringWithFormat:@"sectionHeaderView:<some #, letter, or tag>", <SOMETHING UNIQUE ADD HERE>];
UITableViewHeaderFooterView *myHeaderView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:someIdentifier];
if (!myHeaderView) {
// No header view found with that ID. Make a new one
}
...
return myHeaderViewForSection;
}
这样,无论您手指滚动还是以编程方式设置您喜欢的内容偏移,您的表视图都将知道要绘制什么,何时绘制以及放置它。
使用他们的代表有点拖累,因为它在开始时有点单调乏味,但使用viewForHeaderInSection
证明了我获得我想要的结果的唯一方法。
希望这会有所帮助 - 快乐的编码!
答案 1 :(得分:1)
<强> TL; DR 强>
请勿在{{1}}和beginUpdates
之间明确滚动表格视图。
<强>解释强>
我正在使用NSFetchedResultsController来填充表格。这些是我对NSFetchedResultsControllerDelegate的一些方法的实现。
endUpdates
问题是endUpdates正在进行一系列调用,结束调用我的方法- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[_conversationTableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[_conversationTableView endUpdates];
}
(实际上这是一个非常难看的代码)。顾名思义,此方法调用[self scrollToBottom]
将表格视图滚动到表格的底部。
在- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
- beginUpdates
期间显式滚动表格是我整个问题的罪魁祸首。
<强>解决方案强>
仅在完成endUpdates后滚动表视图。
endUpdates
旁注
这也解决了滚动时表格视图有时会闪烁的问题。
答案 2 :(得分:0)
在不应该显示的情况下,将sectionHeader高度手动设置为0
tableView.sectionHeaderHeight = 0;