Swift 3:如何仅将UICollectionView的最后一行单元格水平居中对齐?

Pan*_*ngu 4 ios uicollectionview uicollectionviewcell swift3

UICollectionView只用了一个部分。这里是一些可视化:

[ x x x ]  
[ x x x ]  
[ x x   ] 
Run Code Online (Sandbox Code Playgroud)

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

[ x x x ]  
[ x x x ]  
[  x x  ] 
Run Code Online (Sandbox Code Playgroud)

我尝试从以下位置实施解决方案:

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

  2. 如何居中对齐UICollectionView的单元格?

但是,解决方案会移动所有单元格,并且如果最后一行不包含X个单元格,则我只想移动LAST行,因为我只有一个部分。

我知道如何设置插图,但是我不知道如何仅靠一个部分并尝试调整单元格的最后一行的插图来实现这一点。

我刚刚开始使用UICollectionView,不确定如何解决此问题?

Anu*_*rag 6

听起来您需要流布局提供的所有内容以及一些自定义设置。子类化流程布局和覆盖layoutAttributesForElements应该可以完成以下工作:

一个快速而肮脏的实现基本上会要求FlowLayout为给定的矩形进行布局,然后找出最后一行中出现的项目。如果少于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
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果计划对插入/删除进行动画处理,则还应该覆盖layoutAttributesForCellWithIndexPath:并确保其返回一致的结果。

苹果有一个关于FlowLayout 的指南,其中有一个专门用于子类化的部分。

游乐场示例:

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


bsa*_*zin 0

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

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