流れのレイアウトが少しカスタマイズして提供するすべてのものが必要なように思えます。
クイックで汚れた実装では、基本的にFlowLayoutに指定された矩形のレイアウトを実行し、最後の行に表示される項目を特定します。 3つ以下のアイテムがある場合は、それらを均等に配置します。あなたが挿入/欠失をアニメーション化を予定している場合、あなたもlayoutAttributesForCellWithIndexPath:
をオーバーライドして、それが一貫性のある結果を返すことを確認する必要があること
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
}
}
は注意してください。
AppleはFlowLayoutにサブクラス化専用のセクションを持つguideを持っています。
サンプル遊び場:
https://gist.github.com/AnuragMishra/0a694dfa9be1a5eab9fc7368b69812ad