Ios 在更改单元格高度的情况下重新加载单元格时,UITableView会滚动到顶部

Ios 在更改单元格高度的情况下重新加载单元格时,UITableView会滚动到顶部,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个表视图,它在加载图像时包含占位符。加载图像时,我调用reloadRowsAtIndexPaths:withRowAnimation:。此时,单元将根据图像的大小更改高度。当这种情况发生时,我希望表视图的内容偏移量保持不变,并且下面的单元格被进一步向下推,正如您可能想象的那样 取而代之,我得到的效果是滚动视图滚动回顶部。我不知道这是为什么,我似乎无法阻止它。将beginUpdates()放在reloadRows行之前和之后的endUpdates()没有效果 我使用的是estimatedRo

我有一个表视图,它在加载图像时包含占位符。加载图像时,我调用
reloadRowsAtIndexPaths:withRowAnimation:
。此时,单元将根据图像的大小更改高度。当这种情况发生时,我希望表视图的内容偏移量保持不变,并且下面的单元格被进一步向下推,正如您可能想象的那样

取而代之,我得到的效果是滚动视图滚动回顶部。我不知道这是为什么,我似乎无法阻止它。将
beginUpdates()
放在
reloadRows
行之前和之后的
endUpdates()
没有效果

我使用的是
estimatedRowHeight
,因为我的表视图可能有数百行不同的高度。我还实现了
tableView:heightforrowatinexpath:


编辑:我已经建立了一个演示项目来测试这一点,我承认我无法让演示项目重现这种效果。我会继续努力的。

这是估计值的问题

估计高度与实际高度的差异越大,表格在重新加载时可能会跳得越多,尤其是向下滚动的距离越远。这是因为表的估计大小与其实际大小完全不同,迫使表调整其内容大小和偏移量


最简单的解决方法是使用真正准确的估计值。如果每行的高度变化很大,请确定行的中间高度,并将其用作估计值。

始终更新主线程上的UI。那就去那个地方吧

[self.tableView reloadData];
在主线程内:

dispatch_async(dispatch_get_main_queue(), ^{
     //UI Updating code here.
     [self.tableView reloadData];
});

我也遇到了同样的问题,我是这样决定的:加载单元格时保存单元格的高度,并在
表格视图中给出准确的值:EstimatedHeightForrowatineXpath

// 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;
}

我看到了这一点,对我有效的修复方法是选择一个估计的行高度,它是可能的行中最小的。当发生意外滚动时,它最初被设置为可能的最大行高。我只是使用了single
tableView.estimatedRowHeight
属性,而不是委托方法。

您可以发布用于获取tableView内容偏移量和设置tableView焦点位置的代码吗?在我的测试中,我尝试了一个非常小的估计值和一个非常大的估计值,但两者都没有不自觉地滚动的效果。这是一个很好的答案。非常感谢。估计的高度不应该是一个随机数,而应该接近您认为的高度。我使用了一个估计大小的调整单元格(我想这会破坏UITableViewAutomaticDimension的用途?)。它为我解决了这个问题。这是因为我的单元格大小变化很大(取决于嵌入其中的UITextView中的用户类型),在我的例子中,我有
self.tableView.estimatedRowHeight=44在超类中。在当前类中将其设置为零,我在该类中固定了行高度,解决了该问题。在主线程中执行重载会如何影响滚动到顶部?