当前位置: 首页 > 知识库问答 >
问题:

重新加载单元格后向上滚动时动态单元格高度跳跃的UITableView

阴永逸
2023-03-14

我有一个表格视图,每个单元格都有自己的高度,因此不适合使用rowHeight。相反,现在我使用let indexSet=NSIndexSet(index: 10)self.tableView.estimatedRowHeight=75。这意味着它调用单元格上的sizeThatFits函数来确定它的高度。这一切都很好。

问题是当你重新加载屏幕上的单元格时。例如,向下滚动以显示单元格10,然后重新加载单元格10,效果很好。但是当您开始向上滚动,经过您已经看到的单元格时,它会恢复到每个单元格的estimatedRowHeight,完全不考虑< code>sizeThatFits,因此在您滚动时会四处跳跃。我不可能给出一个准确或“足够好”的估计dRowHeight,这样这种跳跃就不会被注意到,因为我的细胞将能够显示一行文本或一幅完整的图像——大小相差很大。

我在这里展示了这种效果:

https://vid.me/edgW

我在这方面做了许多不同的尝试,混合使用了heightForRowAtIndexPath、估计的HeightForRowAtIndexPath……等等。我尝试了关于StackOverflow的各种建议。似乎没有任何效果。

我附上了一个非常简单的示例项目,您可以亲自尝试一下:

https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0

    < li >运行项目。 < li >滚动直到看到单元格10。 < li >等待5秒钟,让电池重新加载(它变成紫色)。 < li >向上滚动。

值得注意的是——如果单元格在重新加载时不在视图中,这种情况不会发生。如果它在当前滚动点之上或之下,一切都按预期工作。

共有3个答案

岳嘉容
2023-03-14

在iOS 13.5.1中:

我有一个tableView,其中包含4种类型的单元格,它们都具有不同的动态高度。我在这里遵循了公认的解决方案,但为了解决跳跃效果,我需要在重新加载表视图时添加更多内容:

从接受的答案中,我添加了以下代码:声明此变量

var allCellHeights = [IndexPath : CGFloat]()

然后添加 2 种方法:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
     self.allCellHeights[indexPath] = cell.frame.size.height
 }
 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
     return self.allCellHeights[indexPath] ?? UITableView.automaticDimension
 }

现在我必须在重新加载tableview时添加的额外代码:

let contentOffset = self.tableView.contentOffset
self.tableView.reloadData()
self.tableView.layoutIfNeeded()
self.tableView.setContentOffset(contentOffset, animated: false)

还要检查这个答案:带有动态单元格高度的UITableView的reloadData()会导致跳跃滚动

李俊雅
2023-03-14

我也有这个问题,我使用了SO的解决方案,但我现在找不到。如果我这样做了,我会添加链接。解决方案如下:

表视图的问题是没有正确估计行的高度。要解决此问题,首先在< code>willDisplayCell中缓存高度,下次使用该高度。

代码

在查看中加载:

heightAtIndexPath = [NSMutableDictionary new];


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSNumber *height = @(cell.frame.size.height);
    [heightAtIndexPath setObject:height forKey:indexPath];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if([heightAtIndexPath objectForKey:indexPath]) {
        return [[heightAtIndexPath objectForKey:indexPath] floatValue];
    } else {
        return UITableViewAutomaticDimension;
    }
}
公西博实
2023-03-14

此行为似乎是一个错误,如果没有其他原因,只是在iOS 9上不再可重现。我敢肯定,这并不是什么安慰。

这个问题主要源于不准确的估计,就像@NickCatib所说的那样。在iOS 8上,您可以做的最好的事情就是改善估计。许多人推荐的一种技术是在“将展开”中缓存高度,并在对估计的“估计的行高”的后续调用中使用这些高度。

您可以通过不执行任何操作来使 UITableView 丢弃其缓存来缓解该行为,例如,通过使用单元格直接修改单元格中的内容,而不是在屏幕上使用重新加载。但是,如果您确实需要更改单元格的高度,那将无济于事。

恐怕在表格视图中很难修复这个错误,因为你无法控制布局。通过在失效期间更改< code > contentOffsetAdjustment ,可以更容易地在子类< code > UICollectionViewFlowLayout 中解决该错误,尽管这可能不太容易。

 类似资料:
  • 我觉得这可能是一个常见的问题,我想知道是否有任何共同的解决方案。 基本上,我的UITableView拥有每个单元格的动态单元格高度。如果我不在UITableView的顶部,并且我< code > table view . reloaddata(),向上滚动会变得不稳定。 我认为这是因为我在向上滚动时重新加载了数据,UITableView正在重新计算每个可见单元格的高度。如何减轻这种情况,或者如何只

  • 问题内容: 我觉得这可能是一个常见的问题,并且想知道是否有任何通用的解决方案。 基本上,我的UITableView具有每个单元格的动态单元格高度。如果我不在UITableView和I的顶部,则向上滚动变得跳动。 我相信这是由于以下事实:当我向上滚动时重新加载数据时,UITableView正在重新计算每个可见的单元格的高度。如何缓解这种情况,或者如何仅将数据从某个IndexPath重新加载到UITa

  • 我需要显示一组具有不同高度的collectionViewCells。视图太复杂,我不想手动计算预期的高度。我想强制自动布局来计算单元格高度 在之外调用会破坏ColltionView并导致其崩溃 另一个问题是单元格不在单独的xib中,所以我无法手动实例化临时单元格并将其用于高度计算。 对此有什么解决办法吗? 编辑: 一旦被调用,就会发生崩溃。如果我不调用该方法并返回大小,则一切正常,单元格显示为没有

  • 可变长度的文本数据正在注入到表视图单元格标签中。为了正确调整每个单元格高度的大小,我在中实现了: 这估计高度为88.0像素,如果更大,应该会自动调整高度大小。它非常适用于尚未滚动到的单元格(因为在滚动到单元格时被调用),但不适用于最初在加载数据时在屏幕上呈现的单元格。 我尝试过重新加载数据(正如许多其他资源中建议的那样): 在这两个和,它没有帮助。我迷路了…有人知道如何渲染最初在屏幕上加载的单元格

  • 嗨,在我的应用程序中,我有一个在Tabview中显示带有描述的prodcuts的要求。为了实现这一点,我在Tabview cell content视图上添加了两个satckviews。两个stackviews都保存标签,一个标签有prodcut名称,另一个标签有description。在应用程序发布时,应用程序的单元格高度默认为100,但当我选择单元格时,我想在单元格中显示完整的描述以及产品名称,

  • 我有用自定义单元格(继承自)填充的用户界面视图,每个单元格都包含一个,该视图根据其内容自动调整大小。事情是这样的,如何根据内容(可变视图)更改 单元格的高度。 该解决方案必须是动态的,因为用于填充< code>UIWebViews的HTML是从不断变化的提要中解析的。 我觉得我需要使用委托方法 中更改单元格的高度吗? 任何帮助都是伟大的。谢谢 两年多前我问过这个问题。通过介绍自动布局,可以找到iO