【发布时间】: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