Swift 3:如何水平居中在一个UICollectionView只有一节的最后一行单元格?

我只有一个部分使用UICollectionView 。 这是一些可视化:

 [ xxx ] [ xxx ] [ xx ] 

如果UICollectionView中的最后一行没有填满所有3个单元格,我想将这些单元格居中,如下所示:

 [ xxx ] [ xxx ] [ xx ] 

我试图从以下地方实施解决scheme:

  1. 如何水平居中UICollectionView单元?

  2. 如何居中alignmentUICollectionView的单元格?

但是,解决scheme移动所有的单元格,我只想移动最后一行,如果最后一行不包含X数量的单元格,因为我只有一个部分。

我知道如何设置插入,但我不知道如何做到这一点只是一个部分,并试图调整最后一排单元格的插图。

我刚开始使用UICollectionView ,不知道如何解决这个问题?

听起来像你需要一个stream布局提供一切自定义一切。 子类化stream程布局和覆盖layoutAttributesForElements应该做的工作:

一个快速和肮脏的实现将基本要求FlowLayout做一个给定矩形的布局,然后找出哪些项目出现在最后一行。 如果less于3件,则将它们均匀分开。

 class LastRowCenteredLayout: UICollectionViewFlowLayout { override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { guard var elementAttributes = super.layoutAttributesForElements(in: rect) else { return nil } guard elementAttributes.count > 0 else { return elementAttributes } elementAttributes = elementAttributes.map { $0.copy() as! UICollectionViewLayoutAttributes } let minY = elementAttributes.last!.frame.minY let lastRowAttrs = elementAttributes.reversed().filter { $0.frame.minY == minY } guard lastRowAttrs.count < 3, let first = elementAttributes.first, let last = elementAttributes.last else { return elementAttributes } let horizontalPadding = rect.width - first.frame.minX - last.frame.maxX let horizontalShift = horizontalPadding / 2.0 for attrs in lastRowAttrs { attrs.frame = attrs.frame.offsetBy(dx: horizontalShift, dy: 0) } return elementAttributes } } 

请注意,如果您计划在animation插入/删除,您还应该重写layoutAttributesForCellWithIndexPath:并确保它返回一致的结果。

Apple有一个关于FlowLayout的指南 ,其中有专门的子类。

游乐场示例:

https://gist.github.com/AnuragMishra/0a694dfa9be1a5eab9fc7368b69812ad

简短的答案是:你不能使用Apple提供的UICollectionViewFlowLayout

较长的答案是:您将不得不创build一个客户UICollectionViewLayout子类,并自己放置该元素。 首先阅读本教程 。 然后,您应该对内部工作有更好的了解,以便能够创build自己的自定义布局。