How to center horizontally UICollectionView Cells?
Its not a good idea to use a library, if your purpose is only this i.e to centre align.
Better you can do this simple calculation in your collectionViewLayout function.
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
let totalCellWidth = CellWidth * CellCount
let totalSpacingWidth = CellSpacing * (CellCount - 1)
let leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
let rightInset = leftInset
return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)
}
Center horizontal UICollectionView based on content
Assuming your current code is working when you the cells will fit - that is, it centers the "row of cells" when desired - change this line:
let leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
to:
let leftInset = max(0, (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2.0)
That way your insets will never be less than Zero
How to center align the cells of a UICollectionView in Swift3.0?
This ended up being the solution I used. Read the code comments for a better understanding. Swift 5
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
//Where elements_count is the count of all your items in that
//Collection view...
let cellCount = CGFloat(elements_count)
//If the cell count is zero, there is no point in calculating anything.
if cellCount > 0 {
let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
let cellWidth = flowLayout.itemSize.width + flowLayout.minimumInteritemSpacing
//20.00 was just extra spacing I wanted to add to my cell.
let totalCellWidth = cellWidth*cellCount + 20.00 * (cellCount-1)
let contentWidth = collectionView.frame.size.width - collectionView.contentInset.left - collectionView.contentInset.right
if (totalCellWidth < contentWidth) {
//If the number of cells that exists take up less room than the
//collection view width... then there is an actual point to centering them.
//Calculate the right amount of padding to center the cells.
let padding = (contentWidth - totalCellWidth) / 2.0
return UIEdgeInsets(top: 0, left: padding, bottom: 0, right: padding)
} else {
//Pretty much if the number of cells that exist take up
//more room than the actual collectionView width, there is no
// point in trying to center them. So we leave the default behavior.
return UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 40)
}
}
return UIEdgeInsets.zero
}
How can I center rows in UICollectionView?
A bit of background first - a UICollectionView
is combined with a UICollectionViewLayout
which determines how the cells get placed in the view. This means a collection view is very flexible (you can create almost any layout with it), but also means modifying layouts can be a little confusing.
Creating an entirely new layout class is complex, so instead you want to try and modify the default layout (UICollectionViewFlowLayout
) to get your center alignment. To make it even simpler, you probably want to avoid subclassing the flow layout itself.
Here's one approach (it may not be the best approach, but it's the first one I can think of) - split your cells into two sections, as follows:
[ x x x x x ] <-- Section 1
[ x x x x x ] <-- Section 1
[ x x ] <-- Section 2
This should be fairly straightforward, provided you know the width of your scroll view and the number of cells that can fit in each row.
Then, use the collectionView:layout:insetForSectionAtIndex:
delegate method to set the margins for your second section so as it appears to be vertically centered. Once you've done this, you just need to ensure you recompute the appropriate section divisions/insets so both portrait and landscape orientations can be supported.
There is a somewhat similar question here - How to center align the cells of a UICollectionView? - that goes into more details about the inset methods, although it's not quite trying to do the same thing that you are.
Related Topics
Go Back to View Controller from Skscene
Wkwebview Allowslinkpreview to False Breaks Text Selection
Add Udid in Current Provisioning Profile
iOS 8 Uitableview First Row Has Wrong Height
How to Open Application Using Url
Save Scrollviews Position and Scroll Back to It Later (Offset to Position)
Trim End Off of String in Swift, Getting Error at Runtime
How to Print Out(Nslog) The Properties of a Custom Object Added to a Nsmutablearray
How to Create a Scnnode from a .Usdz
Cancel All Operations + Afnetworking 3.0
Swift 4.2 Make Bottom of Tableview Move Up When Keyboard Shows
Swiftui: Navigate to Home Screen After Login Completed. Navigating Views by Button Click
How to Set UIactivityviewcontroller Gmail Share Subject Different Than Body
Value of Type 'string' Has No Member 'stringbytrimmingcharactersinset'