ios - 调整单元格大小时如何使表格视图动画平滑
问题描述
我有一个带有自定义单元格的 UITable 视图。有些单元格有一个按钮来展开/折叠。有时,正在调整大小的单元格似乎会在 UI 中跳转。
我正在使用自动布局和动态高度计算heightForRowAtIndexPath:
。我浏览了几个教程,包括这个关于 self-sizing table view cells 的教程,我用它来调查这个问题。
要重现此问题,请在表格的中途滚动并展开几个单元格。点击部分显示的单元格。细胞似乎会跳跃而不是停留在原地。
例子:
当我在选择单元格后注释掉滚动到单元格顶部的行时,问题更加明显。
我尝试了@DonMag 的建议。对于小型蜂窝,问题不会发生。当我增加单元格高度以占据屏幕高度的 60% 以上时,就会出现跳跃动画(视频)。
我变了
Question Label.top = topMargin + 8
至
Question Label.top = topMargin + 800
当我深入研究代码时,调用时似乎出现了问题
[tableView beginUpdates];
[tableView endUpdates];
但是这个片段是表格视图重新计算单元格高度所必需的。
我希望单元格在调整大小时保持原位,没有跳跃动画。
解决方案
经过进一步调查,当表格具有不同高度的单元格(例如 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];
推荐阅读
- android - Retrofit2 和 DBFlow 读取保存和实体详细信息
- javascript - 仅允许在材质 ui 中达到一定长度的数字
- python - 使用 python 脚本读取未读邮件
- java - 如何在 Android 中使用计时器
- spring-boot - 请求被拒绝,因为在 Docushare Flex 中创建新文档时未找到多部分边界
- kubernetes - Kubernetes 默认的 liveness 和 readiness 探针
- html - HTML 和 CSS Javascript Jquery
- python - 从熊猫的列列表中删除停用词时出现查找错误
- ios - 函数声明中的 Swift 错误闭包
- javascript - 更改控制器内的模型对象以操作 DOM 对象