调整单元格大小时如何使表格视图动画平滑

Posted

技术标签:

【中文标题】调整单元格大小时如何使表格视图动画平滑【英文标题】:How to make table view animations smooth when resizing a cell 【发布时间】:2019-05-16 14:20:58 【问题描述】:

我有一个带有自定义单元格的 UITable 视图。有些单元格有一个按钮来展开/折叠。有时,正在调整大小的单元格似乎会在 UI 中跳转。

我正在通过heightForRowAtIndexPath: 使用自动布局和动态高度计算。我浏览了几个教程,包括 this one on self-sizing table view cells,我用它来调查这个问题。

要重现此问题,请在表格中滚动并展开几个单元格。点击部分显示的单元格。单元格看起来会跳跃而不是停留在原地。

例子:

Video 1

当我在选择单元格后注释掉滚动到单元格顶部的行时,问题更加明显。

Video 2

我尝试了@DonMag 的建议。对于小型蜂窝,问题不会发生。当我将单元格高度增加到占屏幕高度的 60% 以上时,就会出现跳跃动画 (video)。

我变了

Question Label.top = topMargin + 8

Question Label.top = topMargin + 800


当我深入代码时,调用时似乎出现了问题

[tableView beginUpdates];
[tableView endUpdates];

但是这个 sn-p 是表格视图重新计算单元格高度所必需的。

我希望单元格在调整大小时保持原位,没有跳跃动画。

【问题讨论】:

有多种方法可以展开/折叠单元格,因此您可能需要尝试查看几种不同的方法。一个常见的问题是当使用多行标签时……标签中的文本是垂直居中的,因此随着标签的扩展,文本“显示”并不总是看起来正确。我最近整理了一个类似于您正在尝试做的简单项目。您可以在这里查看github.com/DonMag/ExpandCollapse,看看您是否可以从中获得一些帮助。 谢谢,@DonMag。我已经用更多信息更新了描述 如果您的单元格/行会变得那么高,请确保给 tableView 一个估计值,例如 tableView.estimatedRowHeight = 880(在 viewDidLoad() 中。这应该注意“跳跃”。 【参考方案1】:

经过进一步调查,该问题是由于表格中的单元格高度不同(例如 100 与 800)引起的。我不能对每个单元格使用相同的估计高度,否则在展开/折叠单元格时内容会出现跳跃。

解决方案有两部分,这两部分都是必需的。

使用真实的单元格大小

heightForRowAtIndexPath: 中,每一行都使用精确计算而不是估计。

多个重用池

我为每个 type 单元格分配了一个唯一的 ID。每个 type 的单元格都有相似的高度。比如A型高度=120,B型高度=400。

然后我为每种类型注册了一个不同的单元格“池”。尽管 CustomCell 对于不同的单元格类型是同一个类,但每种单元格类型都有不同的约束和大小。这允许从重用池中取出具有正确估计大小的单元格。

tableView.rowHeight = UITableViewAutomaticDimension;
[tableView registerClass:[CustomCell class] forCellReuseIdentifier:typeA];
[tableView registerClass:[CustomCell class] forCellReuseIdentifier:typeB];
...
NSString *cellID = // Could be typeA, typeB, etc.
cell = [tableView dequeueReusableCellWithIdentifier:cellID];

【讨论】:

以上是关于调整单元格大小时如何使表格视图动画平滑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中同时为单元格和表格更改设置动画?

使用自动布局进行编辑时在表格视图中调整子视图的大小

从自定义表格视图单元格类加载时如何调整单元格的高度?

如何使用自动布局来调整表格视图单元格中的视图大小?

图像在表格视图单元格中下载后调整大小

如何使表格视图单元格的大小动态变化?