ios - swift 3 : How to center horizontally the last row of cells in a UICollectionView with only one section?

标签 ios uicollectionview swift3 uicollectionviewcell

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

[ x x x ]  
[ x x x ]  
[ x x   ] 

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

[ x x x ]  
[ x x x ]  
[  x x  ] 

我尝试从以下地方实现解决方案:

  1. How to center horizontally UICollectionView Cells?

  2. How to center align the cells of a UICollectionView?

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

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

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

最佳答案

听起来您需要流式布局提供的一切以及一些定制。子类化流布局并覆盖 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
    }
}

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

Apple 有一个 guide在 FlowLayout 上有一个专门用于子类化的部分。

Playground 示例:

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

关于ios - swift 3 : How to center horizontally the last row of cells in a UICollectionView with only one section?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091177/

相关文章:

ios - 无法将类型 'NSTaggedPointerString' 的值转换为数组

ios - CGRect 与 4 个矩形相交。如何找出它与哪个矩形最相交?

ios - 将 UICollectionview 中单元格的移动限制在 CollectionView 的范围内

ios - 如何在后台加载 UICollectionView 单元格

swift - 如何在 UICollectionView 拖/放过程中删除 'ghost' 单元格,并使移动单元格不透明?

ios - 转换 JSON 嵌套对象

ios - 从 Google Places API (Swift 3) 获取附近地点的列表

ios - Flash CS5 在 FileMode.READ 情况下处理 "file does not exist"错误

ios - swift 错误 : Editor placeholder in source file

ios - 从字符串初始化 NSItemProvider 的问题