如何水平居中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
希望这可以帮助