用于自动调整大小的全角项目的 UICollectionViewFlowLayout:y 位置不正确

UICollectionViewFlowLayout for self-sizing, full-width items: incorrect y position

我正在尝试实现一个集合视图,其中的项目有:

我知道这很容易完成 UICollectionViewCompositionalLayout,但我正在寻找 iOS 11+ 的解决方案。我决定实施自定义 UICollectionViewFlowLayout:

class SingleColumnFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let collectionView = collectionView,
              let layoutAttributes = super.layoutAttributesForElements(in: rect) else { return [] }
        
        layoutAttributes
            .filter { [=10=].representedElementCategory == .cell }
            .forEach { attributes in
                let availableWidth = collectionView.bounds
                    .inset(by: collectionView.contentInset)
                    .width
                
                attributes.frame.origin.x = sectionInset.left
                attributes.frame.size.width = availableWidth
            }
        
        return layoutAttributes
    }
}

结果和我想象的不太一样:

我使用的单元非常简单:

有趣的是,如果我向标签添加固定宽度约束,它会正常工作,所以我的理论是

我想在没有固定宽度标签的情况下完成这项工作,所以我的问题是:我是否遗漏了任何明显的东西?有办法解决这个问题吗?

对于任何感兴趣的人,我已将整个项目上传到 GitHub

事实证明,问题是由标签的固定尾随约束引起的。标签的固有宽度较小(由于文本较短),并且由于整个单元格在水平方向上受到约束,因此单元格宽度也变小了。我通过将尾随约束从 'equal' 更改为 'greater than'.

来修复它