ios - 自动调整包含 UICollectionView 的 UITableViewCell

标签 ios swift uitableview uicollectionview autolayout

我在使用包含 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 

在这里你可以看到它现在的样子。设置与原始问题中的一样。

再次感谢大家的指点!

Here you can see the result

关于ios - 自动调整包含 UICollectionView 的 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041194/

相关文章:

ios - 使用 GPUImage 捕捉时减少不必要的运动模糊

iphone - Three20框架,如何更改TTTableView的默认行高?

ios - 使用 CIGaussianGradient 滤波器进行核心图像的示例

ios - 在iOS库中使用哪种格式播放视频或音频?

objective-c - youtube 全屏视频不调用 viewWillAppear 或 viewWillRotate

ios - 如何获取每个唯一的 firebase 子项的计数,以便只有开发人员才能看到(而不是用户)

ios - Unwind Segue 将我移至错误的 View Controller

ios - Swift:编辑模式,将 editButtonItem() 链接到 IBAction

swift - 如何调整 UITableViewRowAction 的大小以适应自定义大小的 tableViewCell? - swift 3

ios - 使用FastLane自动化iOS应用