调整单元格大小时如何使表格视图动画平滑
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];
【讨论】:
以上是关于调整单元格大小时如何使表格视图动画平滑的主要内容,如果未能解决你的问题,请参考以下文章