用于自动调整大小的全角项目的 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
}
}
结果和我想象的不太一样:
我使用的单元非常简单:
有趣的是,如果我向标签添加固定宽度约束,它会正常工作,所以我的理论是
- 出于某种原因,集合视图无法正确推断标签的宽度
- 出于这个原因,它认为它可以在同一行中容纳多个项目
- 因此,它为某些项目计算出不正确的
y
值。
我想在没有固定宽度标签的情况下完成这项工作,所以我的问题是:我是否遗漏了任何明显的东西?有办法解决这个问题吗?
对于任何感兴趣的人,我已将整个项目上传到 GitHub。
事实证明,问题是由标签的固定尾随约束引起的。标签的固有宽度较小(由于文本较短),并且由于整个单元格在水平方向上受到约束,因此单元格宽度也变小了。我通过将尾随约束从 'equal' 更改为 'greater than'.
来修复它
我正在尝试实现一个集合视图,其中的项目有:
- 基于约束的自动高度
- 集合视图的全部可用宽度。
我知道这很容易完成 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
}
}
结果和我想象的不太一样:
我使用的单元非常简单:
有趣的是,如果我向标签添加固定宽度约束,它会正常工作,所以我的理论是
- 出于某种原因,集合视图无法正确推断标签的宽度
- 出于这个原因,它认为它可以在同一行中容纳多个项目
- 因此,它为某些项目计算出不正确的
y
值。
我想在没有固定宽度标签的情况下完成这项工作,所以我的问题是:我是否遗漏了任何明显的东西?有办法解决这个问题吗?
对于任何感兴趣的人,我已将整个项目上传到 GitHub。
事实证明,问题是由标签的固定尾随约束引起的。标签的固有宽度较小(由于文本较短),并且由于整个单元格在水平方向上受到约束,因此单元格宽度也变小了。我通过将尾随约束从 'equal' 更改为 'greater than'.
来修复它