发生单元格内容交互时更新 TableView 单元格高度
Posted
技术标签:
【中文标题】发生单元格内容交互时更新 TableView 单元格高度【英文标题】:Update TableView Cell Height as cell content interaction happens 【发布时间】:2020-02-26 02:19:04 【问题描述】:我有一个UITableView
,其中包含许多单元格。在下面的示例中,这两行中的每一个都包含一个 UICollectionView
,它正在管理标签。初始加载工作正常,tableView
根据 UICollectionView 高度正确调整行大小。
在viewDidLoad
方法中,我为tableView
设置了如下配置:
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = UITableView.automaticDimension
然后,在viewDidAppear
方法中,我要求更新tableView
,如下所示:
override func viewDidAppear(_ animated: Bool)
tableView.beginUpdates()
tableView.endUpdates()
问题 1: 这种工作,除了它动画 tableView 行高的增加。有没有办法只在初始加载时解决这个问题?
第二个问题是,如果用户与内容交互并删除其中一个,即使 collectionView
调整大小,它更新的内容大小也不会触发 tableView
行更新其高度,可以看出在下面的屏幕截图中:
这可能是因为它位于 tableView
cell
内,因为通常情况下,collectionView
会自动调整大小。当collectionView
在tableView
之外时,请参阅下面的屏幕截图。
如果我滚动 tableView
,该行将作为双端队列/重用过程的一部分正确调整大小。见下文:
我认为问题的一部分是collectionView
在tableViewCell
内时的布局约束是它被固定在tableViewCell
的边缘,但除非我这样做,否则它不会无法正确显示所以迷路了...
问题 2: 如何修复 tableView 行高根据其内容的更改调整大小?
【问题讨论】:
通常您将tableView.estimatedRowHeight
设置为估计的高度。大多数情况下,该值无关紧要。尝试 44 到 88(或其他)之间的值。只是不要使用UITableView.automaticDimension
。至于何时更新集合视图,您需要在您的集合视图上实现一个自定义委托,您的表视图控制器可以订阅该委托。当该委托方法触发您的表格视图控制器时,您可以为相应的表格视图单元格调用tableView.reloadRows
。试一试,告诉我们进展如何。
【参考方案1】:
问题#1 - 在viewDidAppear
中使用tableView.reloadData()
而不是beginUpdates
。
问题#2 - 当用户与UICollectionView
的内容交互时调用tableView.reloadRows()
。
【讨论】:
我不建议在更新单个单元格时重新加载整个表格视图。这会导致糟糕的用户体验。 是的,我同意不使用reloadData
。 @Timur - 看看这个来自 Apple 的视频,尤其是在 30 分钟时...developer.apple.com/videos/play/wwdc2018/225/?time=41
@Anthony,感谢您的视频!我完全同意你和 Rob 的看法 - reloadRows 是更好的解决方案。以上是关于发生单元格内容交互时更新 TableView 单元格高度的主要内容,如果未能解决你的问题,请参考以下文章
“适合”(也称为“sizeToFit”)其动态单元格内容大小的 TableView。然后嵌套在同样“大小适合”的父 UIView 中