我有一个表格视图,它在图像中加载时包含占位符。加载图片后,我拨打reloadRowsAtIndexPaths:withRowAnimation:
。此时,单元格会根据图像的大小更改高度。当发生这种情况时,我希望表视图的内容偏移保持在原位,并且下面的单元格可以进一步向下推,就像您想象的那样。
我得到的效果是滚动视图滚动回到顶部。我不确定为什么会这样,我似乎无法阻止它。将beginUpdates()
放在endUpdates()
行之前和reloadRows
之后无效。
我正在使用estimatedRowHeight
,因为我的表视图可能有数百行不同的高度。我也在实施tableView:heightForRowAtIndexPath:
。
答案 0 :(得分:28)
这是estimatedRowHeight的一个问题。
estimatedRowHeight与实际高度的差异越大,表重新加载时可能跳得越多,特别是滚动得越往下。这是因为表格的估计大小与其实际大小完全不同,迫使表格调整其内容大小和偏移量。
最简单的解决方法是使用非常准确的估算值。如果每行的高度变化很大,请确定行的中间高度,并将其用作估算值。
答案 1 :(得分:10)
始终更新主线程上的用户界面。所以只需放置
[self.tableView reloadData];
在主线程中:
dispatch_async(dispatch_get_main_queue(), ^{
//UI Updating code here.
[self.tableView reloadData];
});
答案 2 :(得分:6)
我遇到了同样的问题并通过这种方式决定:在加载时保存单元格的高度,并在tableView:estimatedHeightForRowAtIndexPath
中给出确切的值:
// declare cellHeightsDictionary
NSMutableDictionary *cellHeightsDictionary;
// save height
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath];
}
// give exact height value
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSNumber *height = [cellHeightsDictionary objectForKey:indexPath];
if (height) return height.doubleValue;
return UITableViewAutomaticDimension;
}
答案 3 :(得分:0)
我看到了这个,而对我有用的修复方法是选择估计的行高,这是可能行中最小的行。当非预期的滚动发生时,它最初被设置为最大可能的行高。我只使用单tableView.estimatedRowHeight
属性,而不是委托方法。