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

时间:2019-05-16 14:20:59

标签: ios uikit

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

我正在通过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];

但是此摘要对于表格视图重新计算单元格高度是必需的。

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

1 个答案:

答案 0 :(得分:0)

进一步调查后,问题出在桌子上的单元格高度不同(例如100对800)时。我不能为每个单元格使用相同的估计高度,否则在扩展/折叠单元格时内容似乎会跳动。

解决方案分为两部分,都需要。

使用实际单元格大小

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

多个重用池

我为单元格的每个类型分配了唯一的ID。每个类型单元格都有相似的高度。例如,类型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];