我怎么知道数据在 collectionView 中显示为 3 个水平行?

How do i know data is displayed in 3 horizontal rows in collectionView?

我有包含 6 个对象的数组,显示如下。 我需要的是我想让水平行数为 3 我怎样才能通过集合视图获得它..?

我正在使用以下代码将单元格设置在屏幕中央

class CollectionViewRow {

    var attributes = [UICollectionViewLayoutAttributes]()
    var spacing: CGFloat = 0

    init(spacing: CGFloat) {
        self.spacing = spacing
    }

    func add(attribute: UICollectionViewLayoutAttributes) {
        attributes.append(attribute)
    }

    var rowWidth: CGFloat {
        return attributes.reduce(0, { result, attribute -> CGFloat in
            return result + attribute.frame.width
        }) + CGFloat(attributes.count - 1) * spacing
    }

    func centerLayout(collectionViewWidth: CGFloat) {
        let padding = (collectionViewWidth - rowWidth) / 2
        var offset = padding
        for attribute in attributes {
            attribute.frame.origin.x = offset
            offset += attribute.frame.width + spacing
        }
    }
}

class UICollectionViewCenterLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let attributes = super.layoutAttributesForElements(in: rect) else {
            return nil
        }

        var rows = [CollectionViewRow]()
        var currentRowY: CGFloat = -1

        for attribute in attributes {
            if currentRowY != attribute.frame.midY {
                currentRowY = attribute.frame.midY
                rows.append(CollectionViewRow(spacing: 10))
            }
            rows.last?.add(attribute: attribute)
        }

        rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }
        return rows.flatMap { [=10=].attributes }
    }
}

如果您正在创建自己的布局子类,那么您可以为其添加一个值,例如...

class UICollectionViewCenterLayout: UICollectionViewFlowLayout {

    var numberOfRows: Int = 0

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let attributes = super.layoutAttributesForElements(in: rect) else {
            return nil
        }

        var rows = [CollectionViewRow]()
        var currentRowY: CGFloat = -1

        for attribute in attributes {
            if currentRowY != attribute.frame.midY {
                currentRowY = attribute.frame.midY
                rows.append(CollectionViewRow(spacing: 10))
            }
            rows.last?.add(attribute: attribute)
        }

        rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }

        // add this bit
        self.numberOfRows = rows.count

        return rows.flatMap { [=10=].attributes }
   }
}

然后在您的视图中,您可以访问布局(或者最好仍将其存储为 var)并从中获取 numberOfRows

if let layout = self.collectionView.collectionViewLayout as? namesLayout {
      print("numberOfRows===\(layout.numberOfRows)")
      rowsCount = layout.numberOfRows
  }

此外...不要将您自己的布局命名为 UICollectionView...,只需将其命名为 CenterLayoutNamesLayout 或其他名称即可。 :D 让它更短。