Pan*_*ngu 4 ios uicollectionview uicollectionviewcell swift3
我UICollectionView只用了一个部分。这里是一些可视化:
[ x x x ]
[ x x x ]
[ x x ]
Run Code Online (Sandbox Code Playgroud)
如果的最后一行UICollectionView没有填满所有3个单元格,我想像这样将这些单元格居中:
[ x x x ]
[ x x x ]
[ x x ]
Run Code Online (Sandbox Code Playgroud)
我尝试从以下位置实施解决方案:
但是,解决方案会移动所有单元格,并且如果最后一行不包含X个单元格,则我只想移动LAST行,因为我只有一个部分。
我知道如何设置插图,但是我不知道如何仅靠一个部分并尝试调整单元格的最后一行的插图来实现这一点。
我刚刚开始使用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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果计划对插入/删除进行动画处理,则还应该覆盖layoutAttributesForCellWithIndexPath:并确保其返回一致的结果。
苹果有一个关于FlowLayout 的指南,其中有一个专门用于子类化的部分。
游乐场示例:
https://gist.github.com/AnuragMishra/0a694dfa9be1a5eab9fc7368b69812ad
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |