首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套UICollectionView与UICollectionViewCompositionalLayout

嵌套UICollectionView与UICollectionViewCompositionalLayout
EN

Stack Overflow用户
提问于 2021-10-24 02:06:24
回答 1查看 283关注 0票数 0

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

这个完全相同的设置在之前起作用,唯一的区别是UICV2是一个UITableView。由于代码重构和重用,我转而使用UICollectionView。新的视图层次结构如下所示:

代码语言:javascript
复制
+--------------------+
| UICV1              |
| +----------------+ |
| | Cell           | |
| | +------------+ | |
| | | Stack View | | |
| | | +--------+ | | |
| | | | UICV2  | | | |
| | | +--------+ | | |
| | +------------+ | |
| +----------------+ |
| ...                |
+--------------------+

这两个集合视图都配置了一个UICollectionViewCompositionalLayout

代码语言:javascript
复制
// 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
)

这是自调整集合视图的代码:

代码语言:javascript
复制
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为这两个集合视图提供数据。

我希望有人能在这里帮助我,在invalidateLayout()setNeedsLayout()layoutIfNeeded()的组合下,在SelfSizingCollectionView的不同位置上玩了之后,我完全迷失了方向。

我找到了大量关于自调整集合视图的答案,我将其合并到我的代码中,但它们似乎不适用于非常新的UICollectionViewCompositionalLayout

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-25 14:36:48

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

代码语言:javascript
复制
let collectionView = SelfSizingCollectionView(
    frame: bounds,
    collectionViewLayout: layout2
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69693373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档