Hey. I need collection cell oriented help via UICollectionViewFlowLayout. My ultimate goal is for the first cell to be in the middle and each cell to snap in the middle. Thank!
Here's what it looks like now:

and what I want it to look like this:

I found this "solution" on SO, but it does not seem to work properly.
class CenterAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElementsInRect(rect)
let leftPadding: CGFloat = 8
let interItemSpacing: CGFloat = 5
var leftMargin: CGFloat = leftPadding
var maxY: CGFloat = -1.0
var rowSizes: [[CGFloat]] = []
var currentRow: Int = 0
attributes?.forEach { layoutAttribute in
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = leftPadding
if rowSizes.count == 0 {
rowSizes = [[leftMargin, 0]]
} else {
rowSizes.append([leftMargin, 0])
currentRow += 1
}
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + interItemSpacing
maxY = max(layoutAttribute.frame.maxY, maxY)
rowSizes[currentRow][1] = leftMargin - interItemSpacing
}
leftMargin = leftPadding
maxY = -1.0
currentRow = 0
attributes?.forEach { layoutAttribute in
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = leftPadding
let rowWidth = rowSizes[currentRow][1] - rowSizes[currentRow][0]
let appendedMargin = (collectionView!.frame.width - leftPadding - rowWidth - leftPadding) / 2
leftMargin += appendedMargin
currentRow += 1
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + interItemSpacing
maxY = max(layoutAttribute.frame.maxY, maxY)
}
return attributes
}
source
share