ios - 调整单元格大小时如何使表格 View 动画平滑

标签 ios uikit

我有一个带有自定义单元格的 UITable View 。有些单元格有一个展开/折叠按钮。有时,正在调整大小的单元格看起来会在 UI 中跳跃。

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

要重现该问题,请在表格中间滚动并展开多个单元格。点击部分显示的单元格。单元格看起来会跳跃,而不是停留在原地。

示例:

Video 1

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

Video 2

我尝试了@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/

相关文章:

ios - 为什么 UICollectionView 在 Xcode 11 (ios 13) 中省略 Line/Intrim 间距?

iphone - UIView翻转动画

ios - UITableView 和 UINavigationBar 自定义混淆。关于如何完成的任何建议?

ios - 使用默认的 MonoTouch 解决方案会产生构建错误

ios - UIButton 层样式使应用程序变慢

ios - Apple Watch 使用本地化语言作为基本语言

Swift:使 UIView 的轮廓看起来像草图

ios - 在 tvOS 上显示 UITextView 的焦点效果?

ios - Xcode 派生数据位置

iphone - iOS - UIDocumentInteractionController 和添加 View