如何在 UICollectionView 中正确实现标签布局。我快要崩溃了

问题描述 投票:0回答:1

我正在尝试在我的应用程序中使用 UICollectionView 实现标签布局。我想实现这样的事情:

What I'm trying to implement

我的自定义流程布局代码如下:

// Custom Flow Layout to keep Items left aligned in collection view
class LeftAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
   override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let attributes = super.layoutAttributesForElements(in: rect) else {
            return nil
        }

        let collectionViewWidth = collectionView?.frame.width ?? 0
        var rows = [Row]()
        let spacing: CGFloat = 8
        var offsetY: CGFloat = 0
        var offsetX: CGFloat = 10

        rows.append(Row())

        for attribute in attributes {
            let neededWidth = CGFloat(attribute.frame.width) + spacing
            let neededMaxX = offsetX + neededWidth

            if neededMaxX <= collectionViewWidth {
                attribute.frame.origin.x = offsetX
                attribute.frame.origin.y = offsetY
                offsetX = neededMaxX
                rows.last?.add(attribute: attribute)
            } else {
                offsetY += (rows.last?.attributes.last?.frame.height ?? 0) + spacing
                attribute.frame.origin.x = spacing
                attribute.frame.origin.y = offsetY
                offsetX = attribute.frame.origin.x + neededWidth
                rows.append(Row())
                rows.last?.add(attribute: attribute)
            }
        }
        return rows.flatMap { $0.attributes }
    }
}

class Row {
    var attributes = [UICollectionViewLayoutAttributes]()
    init() {}
    func add(attribute: UICollectionViewLayoutAttributes) {
        attributes.append(attribute)
    }
}

我尝试了这个自定义布局代码,但我遇到了以下崩溃:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“来自首选布局属性的舍入框架 ({{8.9884656743115785e+307, 8.9884656743115785e+307}, {210, 32}}) 导致框架具有 1或更多无效成员 ({{inf, inf}, {210, 32}})。

请指出我在这里做错了什么。

swift uicollectionview tags
1个回答
0
投票

我尝试运行您的代码,但似乎无法完全定位问题(在我的情况下,它在未设置

itemSize
的情况下错误地计算了大小,因此您的项目中可能有更多时刻可能会导致此错误)。但是,查看这段代码,我会检查
attribute.frame.width
值,无论它们是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.