我有一个带有自定义单元格的UITable视图。一些单元格具有一个按钮来展开/折叠。有时,正在调整大小的单元似乎在用户界面中跳转。
我正在通过heightForRowAtIndexPath:
使用自动布局和动态高度计算。我浏览了一些教程,包括this one on self-sizing table view cells,我正在使用它们来研究这个问题。
要重现该问题,请在表格中间滚动并展开几个单元格。点按部分显示的单元格。该单元似乎会跳而不是停留在原处。
示例:
当我在选择一个单元格后注释掉滚动到该单元格顶部的行时,问题更加明显。
我尝试了@DonMag的建议。使用小单元时,不会发生此问题。当我将单元格高度增加到占屏幕高度的60%以上时,就会出现跳转动画(video)。
我改变了
Question Label.top = topMargin + 8
到
Question Label.top = topMargin + 800
当我深入研究代码时,调用时似乎会出现问题
[tableView beginUpdates];
[tableView endUpdates];
但是此摘要对于表格视图重新计算单元格高度是必需的。
我希望单元格在调整大小时保持在原位,而没有跳跃动画。
答案 0 :(得分:0)
进一步调查后,问题出在桌子上的单元格高度不同(例如100对800)时。我不能为每个单元格使用相同的估计高度,否则在扩展/折叠单元格时内容似乎会跳动。
解决方案分为两部分,都需要。
使用实际单元格大小
在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];