发生单元格内容交互时更新 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 会自动调整大小。当collectionViewtableView 之外时,请参阅下面的屏幕截图。

如果我滚动 tableView,该行将作为双端队列/重用过程的一部分正确调整大小。见下文:

我认为问题的一部分是collectionViewtableViewCell 内时的布局约束是它被固定在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 单元格高度的主要内容,如果未能解决你的问题,请参考以下文章

TableView 不显示单元格内容

在Swift中单击后修改tableview中的单元格内容

UITableView 单元格内容未正确显示

“适合”(也称为“sizeToFit”)其动态单元格内容大小的 TableView。然后嵌套在同样“大小适合”的父 UIView 中

重叠表格单元格内容[关闭]

移除单元格附件后,如何将微调器与单元格内容视图居中?