【问题标题】:Nested UICollectionView with UICollectionViewCompositionalLayout使用 UICollectionViewCompositionalLayout 嵌套 UICollectionView
【发布时间】:2021-12-10 01:43:30
【问题描述】:

我有两个 UICollectionViews,UICV1,其中一个单元格中嵌套了 UICV2。我想要的是 UICV2 根据其内容自行调整大小,但 contentSizecollectionViewLayout.collectionViewContentSize 都是 zero

之前的设置完全相同,唯一的区别是UICV2UITableView。由于代码重构和重用,我改用UICollectionView。新的视图层次结构看起来像这样:

+--------------------+
| UICV1              |
| +----------------+ |
| | Cell           | |
| | +------------+ | |
| | | Stack View | | |
| | | +--------+ | | |
| | | | UICV2  | | | |
| | | +--------+ | | |
| | +------------+ | |
| +----------------+ |
| ...                |
+--------------------+

两个集合视图都配置了UICollectionViewCompositionalLayout

// UICV1
let layout1 = UICollectionViewCompositionalLayout { sectionIndex, layoutEnvironment in
    let itemSize = NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .estimated(100)
    )

    let item = NSCollectionLayoutItem(layoutSize: itemSize)

    let group = NSCollectionLayoutGroup.horizontal(
        layoutSize: itemSize,
        subitem: item,
        count: 1
    )

    return NSCollectionLayoutSection(group: group)
}

// UICV2
let layout2 = UICollectionViewCompositionalLayout.list(using: {
    var configuration = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
    configuration.headerMode = .none
    configuration.headerTopPadding = 0
    return configuration
}())

let collectionView = SelfSizingCollectionView(
    frame: .zero,
    collectionViewLayout: layout2
)

这是self sizing collection view的代码:

class SelfSizingCollectionView: UICollectionView {
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: layout)
        isScrollEnabled = false
        contentInsetAdjustmentBehavior = .never
    }
        
    override var contentSize: CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        invalidateIntrinsicContentSize()
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        
        // This is always (0.0, 0.0)
        return CGSize(
            width: UIView.noIntrinsicMetric,
            height: collectionViewLayout.collectionViewContentSize.height
        )
    }

}

我正在使用 NSDiffableDataSourceSnapshot 为两个集合视图提供数据,如果这有什么不同的话。

我希望有人可以在这里帮助我,在SelfSizingCollectionView 内的各个点玩invalidateLayout()setNeedsLayout()layoutIfNeeded() 的组合后,我完全迷失了。

我找到了大量关于自定义大小的集合视图的答案,我将它们合并到我的代码中,但它们似乎不适用于全新的 UICollectionViewCompositionalLayout

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewlayout uicollectionviewcompositionallayout


    【解决方案1】:

    我现在通过将初始边界传递给SelfSizingCollectionView 来修复它。不知道这是否带有警告或任何不可预见的副作用,但目前有效。

    let collectionView = SelfSizingCollectionView(
        frame: bounds,
        collectionViewLayout: layout2
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2023-04-11
      相关资源
      最近更新 更多