我正在使用只有一个部分的 UICollectionView
。这是一些可视化:
[ x x x ]
[ x x x ]
[ x x ]
如果 UICollectionView
的最后一行没有填充所有 3 个单元格,我想像这样将这些单元格居中:
[ x x x ]
[ x x x ]
[ x x ]
我尝试从以下地方实现解决方案:
但是,解决方案会移动所有单元格,如果最后一行不包含 X 个单元格,我只想移动最后一行,因为我只有一个部分。
我知道如何设置插图,但我不知道如何通过只有一个部分并尝试调整最后一行单元格的插图来实现这一点。
我刚开始使用 UICollectionView
,不确定如何解决这个问题?
最佳答案
听起来您需要流式布局提供的一切以及一些定制。子类化流布局并覆盖 layoutAttributesForElements
应该可以完成这项工作:
一个快速而肮脏的实现基本上会要求 FlowLayout 为给定的矩形进行布局,然后找出最后一行中出现的项目。如果少于 3 个项目,则将它们均匀分布。
class LastRowCenteredLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard var elementAttributes = super.layoutAttributesForElements(in: rect) else { return nil }
guard elementAttributes.count > 0 else { return elementAttributes }
elementAttributes = elementAttributes.map { $0.copy() as! UICollectionViewLayoutAttributes }
let minY = elementAttributes.last!.frame.minY
let lastRowAttrs = elementAttributes.reversed().filter { $0.frame.minY == minY }
guard lastRowAttrs.count < 3,
let first = elementAttributes.first,
let last = elementAttributes.last else {
return elementAttributes
}
let horizontalPadding = rect.width - first.frame.minX - last.frame.maxX
let horizontalShift = horizontalPadding / 2.0
for attrs in lastRowAttrs {
attrs.frame = attrs.frame.offsetBy(dx: horizontalShift, dy: 0)
}
return elementAttributes
}
}
请注意,如果您计划对插入/删除进行动画处理,您还应该覆盖 layoutAttributesForCellWithIndexPath:
并确保它返回一致的结果。
Apple 有一个 guide在 FlowLayout 上有一个专门用于子类化的部分。
Playground 示例:
https://gist.github.com/AnuragMishra/0a694dfa9be1a5eab9fc7368b69812ad
关于ios - swift 3 : How to center horizontally the last row of cells in a UICollectionView with only one section?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091177/