多次调用估计的HeightForRowAtIndexPath 导致不稳定的uitableview

Posted

技术标签:

【中文标题】多次调用估计的HeightForRowAtIndexPath 导致不稳定的uitableview【英文标题】:estimatedHeightForRowAtIndexPath called many times resulting in jerky uitableview 【发布时间】:2016-01-22 18:26:56 【问题描述】:

我在一个应用程序中有一个要求,其中几乎每个 uitableviewcell 都具有不同的高度。此外,许多单元格都有带文本的图像(1,2 或 3)。

之前我使用的是 heightForRowAtIndexpath,但和往常一样,性能非常可悲,感觉很生涩,

我做了以下来解决这个问题,

    已实现 estimatedHeightForRowAtIndexPath 使用缓存来计算高度,以便后续调用estimatedHeightForRowAtIndexPath 在所有单元格中使用自动布局。

与以前的方法相比,性能要好得多, 但是,estimatedHeightForRowAtIndexPath 随后被调用了很多次,因此列表很不稳定。

如果单元格编号 N 被加载,estimatedHeightForRowAtIndexPath 被调用 N-1 次,如果我们在列表中更进一步就会发生这种情况,如果我们往回走,它就会知道估计的高度。

请帮助我了解为什么会发生这种情况,以及我可以做些什么来提高性能并让滚动更流畅。

【问题讨论】:

【参考方案1】:

为了让桌子光滑,我使用了这个策略..

    每当我填充我的 tableView 数据源时,我都会计算每个单元格的高度。我将每个单元格的高度存储在一个数组中cellHeightsheightforRowAtIndexPath,我返回cellHeights[indexPath.row]

由此产生的过渡一直非常平滑:)

【讨论】:

同意,但我想,最好完全依赖自动布局来实现可重用性和灵活布局。【参考方案2】:

与其责怪框架“过于频繁地”向你发送消息,你应该责怪自己的代码响应速度不够快。你说:

之前我使用 heightForRowAtIndexpath,但像往常一样,性能非常可悲,感觉很生涩

但是你的“像往常一样”是错误的。如果你不能从heightForRowAtIndexPath:立即返回结果,那么你这个方法的实现是错误的。您应该“记忆”您的高度计算,以便在计算一次行的高度之后,您知道它的高度永远不会。

【讨论】:

好吧,我根本不使用'heightforrow...' 如果我们想完全依赖自动布局,我们不应该这样做。估计高度专门用于摆脱明确计算高度。正如我所说,我的单元格高度不断变化,并且有许多带有图像和文本的子视图。此外,我的问题与“为什么它调用这么多次”有关,因为这是罪魁祸首,它会产生生涩的行为。一旦所有的高度都已知,桌面视图就会像黄油一样光滑。

以上是关于多次调用估计的HeightForRowAtIndexPath 导致不稳定的uitableview的主要内容,如果未能解决你的问题,请参考以下文章

幂等策略分析

极大似然估计

同时运行一个进程多次

多臂赌博机

使用 scipy integration.quad 重复评估积分

你如何估计智能合约调用所需的 gas 量?