自动调整包含UICollectionView

时间:2019-03-07 10:13:20

标签: ios swift uitableview uicollectionview autolayout

我在自动调整包含UICollectionView的UITableViewCell时遇到麻烦。视图层次结构大致是这样

UITableViewCell
-- Content View
---- Custom View
------ UIStackView (vertical)
--------- UILabel
--------- UICollectionView (vertical flow layout)

创建或重新使用UITableViewCell时,collectionView会接收一个数据源,然后开始处理该数据源。我需要将collectionView的所有单元格都显示在tableViewCell中,因此我在这样的自定义视图中观察到collectionView内容大小的变化

    self.collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil)

collectionView完成呈现其内容后,我将读取其contentSize并相应地设置集合视图的高度约束。效果很好。

现在的问题是所有值都可以正确计算,但是tableView中的单元格大小不会更改。控制台中没有自动布局错误或警告,因此我假设所有约束都是正确的。 stackView中的标签也可以自动调整大小,并且效果很好。

我可以将有关stackView的新contentSize的信息一直传递到TableViewController,但是我不知道该在哪里调用自动布局以重新计算单个单元格高度的方法。

如果在单元格中collectionView的高度限制与其内容大小不匹配时,我在控制器级别调用tableView.reloadData(),则它确实起作用。但这会导致延迟,并且显然太昂贵了。

如果我将更改为tableView的单元格传递给它,并要求它仅重新加载该单元格,则tableView找不到该单元格的indexPath(可能是因为它仍然不在屏幕上)。因此这种方法行不通。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先感谢大家的回应!

拔出头发两天后,UITableViewCell layout not updating until cell is reused似乎为我解决了。

问题是失踪

    cell.layoutIfNeeded()

的末尾
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

在这里您可以看到现在的样子。设置与原始问题类似。

再次感谢大家的指点!

Here you can see the result