我在使用包含 UICollectionView 的自动调整大小的 UITableViewCell 时遇到问题。 View 层级大致是这样
UITableViewCell
-- Content View
---- Custom View
------ UIStackView (vertical)
--------- UILabel
--------- UICollectionView (vertical flow layout)
当创建或重用 UITableViewCell 时,collectionView 会收到一个数据源,然后开始处理该数据源。我需要 collectionView 的所有单元格都显示在 tableViewCell 中,所以我观察自定义 View 中 collectionView 内容大小的变化,如下所示
self.collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil)
一旦 collectionView 完成其内容的渲染,我就会读取它的 contentSize 并相应地设置 Collection View 的高度约束。这很好用。
现在的问题是所有值都计算正确,但单元格大小在 tableView 中没有改变。控制台中没有自动布局错误或警告,因此我假设所有约束都是正确的。 stackView 中的标签也可以自动调整大小,而且效果很好。
我可以将有关 stackView 的新 contentSize 的信息一直传递到 TableViewController,但我不知道该调用什么来强制自动布局重新计算单个单元格的高度。
如果单元格中 collectionView 的高度约束与其内容大小不匹配,我在 Controller 级别调用 tableView.reloadData()
,它会起作用。但它会造成延迟,而且显然代价太大。
如果我将已更改的单元格传递给 tableView 并要求它仅重新加载单元格,tableView 找不到单元格的 indexPath(可能是因为它仍在屏幕外)。所以这个方法行不通。
谢谢!
最佳答案
首先感谢大家的回复!
拔头发两天后,看起来像UITableViewCell layout not updating until cell is reused帮我解决了。
问题是丢失
cell.layoutIfNeeded()
在结束时
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
在这里你可以看到它现在的样子。设置与原始问题中的一样。
再次感谢大家的指点!
关于ios - 自动调整包含 UICollectionView 的 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041194/