首页 > 解决方案 > 调整单元格大小时如何使表格视图动画平滑

问题描述

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

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

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

例子:

视频 1

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

视频 2

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

我变了

Question Label.top = topMargin + 8

Question Label.top = topMargin + 800


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

[tableView beginUpdates];
[tableView endUpdates];

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

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

标签: iosuikit

解决方案


经过进一步调查,当表格具有不同高度的单元格(例如 100 与 800)时,会导致此问题。我不能为每个单元格使用相同的估计高度,否则在展开/折叠单元格时内容似乎会跳跃。

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

使用真实的像元大小

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];

推荐阅读