我有一个带有自定义单元格的 UITable View 。有些单元格有一个展开/折叠按钮。有时,正在调整大小的单元格看起来会在 UI 中跳跃。
我正在通过 heightForRowAtIndexPath:
使用自动布局和动态高度计算。我浏览了几个教程,包括 this one on self-sizing table view cells ,我用它来调查这个问题。
要重现该问题,请在表格中间滚动并展开多个单元格。点击部分显示的单元格。单元格看起来会跳跃,而不是停留在原地。
示例:
当我注释掉选择单元格后滚动到单元格顶部的行时,问题更加明显。
我尝试了@DonMag的建议。对于小基站,这个问题不会发生。当我增加单元格高度以占据 > 60% 的屏幕高度时,会发生跳跃动画 ( video )。
我变了
问题Label.top = topMargin + 8
至
问题Label.top = topMargin + 800
当我深入代码时,问题似乎发生在调用时
[tableView beginUpdates];
[tableView endUpdates];
但是这个代码片段对于表格 View 重新计算单元格高度是必需的。
我希望单元格在调整大小时保持在原位,而不需要跳跃动画。
最佳答案
经过进一步调查,该问题是由于表格中的单元格高度不同(例如 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];
关于ios - 调整单元格大小时如何使表格 View 动画平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56170770/