首页 > 解决方案 > 将 CollectionView 嵌入到具有动态高度的 CollectionViewCell 中

问题描述

两个集合视图都使用组合布局和可区分的数据源。每个外部集合视图单元都嵌入一个集合视图。

外部集合视图具有估计的组高度,即

let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(300.0))
let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
        
let section = NSCollectionLayoutSection(group: group)

每个单元格的集合视图都受单元格内容视图的前导、尾随、顶部、底部锚点的约束。IE

NSLayoutConstraint.activate([
    cellView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
    cellView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
    cellView.topAnchor.constraint(equalTo: contentView.topAnchor),
    cellView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])

每个单元格的集合视图可以具有大约 50 到 800 的高度范围。

问题是如何将每个单元格调整为单元格集合视图的实际内容大小。由于部分布局不允许单独提供单元格的尺寸。

如果我们给单元格高度估计值太低,比如 50。那么单元格的集合视图只是大小为 50 并且可以垂直滚动(这是不希望的)。

如果我们给单元格高度估计过高,比如 800。那么当单元格的集合视图很小时,单元格中就会留下很大的空白。

我可以在运行时使用单元模型估计高度。但是,我很难找到使当前布局无效的位置,然后使用新的单元格高度触发重新布局。

标签: uicollectionviewuicollectionviewcompositionallayout

解决方案


我的问题由这个 SO 答案解决。

具有估计高度的集合视图组合布局不起作用

奇怪的是,如果如上述答案指出的那样,单元格高度可以更新,

用估计的高度设置项目和组。并设置为水平布局。

在这种情况下,细胞。

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes

可以正确触发。这样我就可以使用单元格的集合视图的内容大小来更新单元格布局属性。


推荐阅读