对于 Swift 5.2
我做了一些调整以满足我的要求
- 如果内容没有超出屏幕,则不滚动
- 如果内容没有延伸到屏幕之外,则居中
- 如果内容确实延伸到屏幕之外,请确保从索引 0 开始并允许滚动,同时从边缘缩进 16(易于调整)
func centerItemsInCollectionView(cellWidth: Double, numberOfItems: Double, spaceBetweenCell: Double, collectionView: UICollectionView) -> UIEdgeInsets {
let totalWidth = cellWidth * numberOfItems
let totalSpacingWidth = spaceBetweenCell * (numberOfItems - 1)
let leftInset = (collectionView.frame.width - CGFloat(totalWidth + totalSpacingWidth)) / 2
let rightInset = leftInset
if leftInset < 0 {
collectionView.isScrollEnabled = true
return UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
}
collectionView.isScrollEnabled = false
return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)
}
通过在视图控制器中执行此操作来使用它
extension BaseViewController : UICollectionViewDelegateFlowLayout {
那你就可以打电话了
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return centerItemsInCollectionView(cellWidth: 70, numberOfItems: 3, spaceBetweenCell: 25, collectionView: collectionView)
}
请记住,如果您想为您的单元格设置自己的大小,您需要在故事板中将 collectionView Estimated Size 设置为 none 并在故事板中将您的单元格大小设置为自定义强>
那你就可以打电话了
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize.init(width:60, height: 60)
}
如果您正在努力获取被调用的方法,那么让您的所有代表都倾听是件好事
extension BaseViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
显然不要忘记设置你的委托,仅仅扩展它们是不行的。
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
...