【问题标题】:UICollectionViewFlowLayout for self-sizing, full-width items: incorrect y positionUICollectionViewFlowLayout 用于自动调整大小的全宽项目:y 位置不正确
【发布时间】:2021-06-25 16:36:09
【问题描述】:

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

  • 基于约束的自动高度
  • 集合视图的完整可用宽度。

我知道这很容易完成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 { $0.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
    }
}

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

我使用的单元格非常简单:

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

  • 由于某种原因,集合视图无法正确推断标签的宽度
  • 因此,它认为它可以在同一行中放置多个项目
  • 因此,它会为某些项目计算错误的y 值。

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

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

【问题讨论】:

    标签: ios uicollectionview uicollectionviewlayout uicollectionviewflowlayout


    【解决方案1】:

    事实证明,问题是由标签的固定尾随约束引起的。标签的固有宽度更小(由于文本短),并且由于整个单元格被水平约束,单元格宽度也变小了。我通过将尾随约束从“等于”更改为“大于”来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2016-10-17
      相关资源
      最近更新 更多