如何水平居中UICollectionView单元?

我已经做了一些研究,但是我找不到任何有关如何在UICollectionView水平居中单元的代码示例。

而不是第一个单元格是这样的X00 ,我想它是这样的0X0 。 有没有办法做到这一点?

编辑:

想象我想要什么:

在这里输入图像说明

当CollectionView中只有一个元素时,我需要它看起来像版本B. 当我有一个以上的元素,那么它应该像版本A,但有更多的元素。

目前看起来像版本A,当我只有一个元素,我不知道如何能让它看起来像B.

谢谢您的帮助!

如果你的目的只是为了中心​​alignment,那么使用库不是一个好主意。

最好在你的collectionViewLayout函数中做这个简单的计算。

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 UIEdgeInsetsMake(0, leftInset, 0, rightInset) } 

我为此使用了KTCenterFlowLayout ,而且效果很好。 这是UICollectionViewFlowLayout的一个自定义子类, UICollectionViewFlowLayout可以根据需要定位单元格。 (注意:通过发布一些代码来解决这个问题并不是一件简单的事情,这就是为什么我要链接到一个GitHub项目!)

迅速3

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { let totalCellWidth = 80 * collectionView.numberOfItems(inSection: 0) let totalSpacingWidth = 10 * (collectionView.numberOfItems(inSection: 0) - 1) let leftInset = (collectionView.layer.frame.size.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2 let rightInset = leftInset return UIEdgeInsetsMake(0, leftInset, 0, rightInset) } 

不要忘记添加协议

 UICollectionViewDelegateFlowLayout 

Darshan Patel的客观C版本的答案是 :

 - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { CGFloat totalCellWidth = kItemWidth * self.dataArray.count; CGFloat totalSpacingWidth = kSpacing * (self.dataArray.count - 1); CGFloat leftInset = (self.bounds.size.width - (totalCellWidth + totalSpacingWidth)) / 2; CGFloat rightInset = leftInset; UIEdgeInsets sectionInset = UIEdgeInsetsMake(0, leftInset, 0, rightInset); return sectionInset; } 

略微修改@Safad Funy的答案,这是在Swift和iOS的最新版本中为我工作的。 在这种情况下,我希望单元格的宽度是集合视图大小的三分之一。

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { let totalCellWidth = Int(collectionView.layer.frame.size.width) / 3 * collectionView.numberOfItems(inSection: 0) let totalSpacingWidth = (collectionView.numberOfItems(inSection: 0) - 1) let leftInset = (collectionView.layer.frame.size.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2 let rightInset = leftInset return UIEdgeInsetsMake(0, leftInset, 0, rightInset) } 

试试这个Swift 4

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { let cellWidth : CGFloat = 165.0 let numberOfCells = floor(self.view.frame.size.width / cellWidth) let edgeInsets = (self.view.frame.size.width - (numberOfCells * cellWidth)) / (numberOfCells + 1) return UIEdgeInsetsMake(15, edgeInsets, 0, edgeInsets) } 

添加您的cellWidth而不是165.0

你可以尝试我的解决scheme,它工作正常,

 func refreshCollectionView(_ count: Int) { let collectionViewHeight = collectionView.bounds.height let collectionViewWidth = collectionView.bounds.width let numberOfItemsThatCanInCollectionView = Int(collectionViewWidth / collectionViewHeight) if numberOfItemsThatCanInCollectionView > count { let totalCellWidth = collectionViewHeight * CGFloat(count) let totalSpacingWidth: CGFloat = CGFloat(count) * (CGFloat(count) - 1) // leftInset, rightInset are the global variables which I am passing to the below function leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2; rightInset = -leftInset } else { leftInset = 0.0 rightInset = -collectionViewHeight } collectionView.reloadData() } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsetsMake(0, leftInset, 0, rightInset) } 

我认为你需要中心单元格,所以而不是使用collectionView我喜欢UITableView将是非常有用的。 只需使用一个UIViewController,并在前面和后面放置两个UIViews,并在中间放置一个UITableView希望这可以帮助