我正在尝试在我的应用程序中使用 UICollectionView 实现标签布局。我想实现这样的事情:
我的自定义流程布局代码如下:
// 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}})。
请指出我在这里做错了什么。
我尝试运行您的代码,但似乎无法完全定位问题(在我的情况下,它在未设置
itemSize
的情况下错误地计算了大小,因此您的项目中可能有更多时刻可能会导致此错误)。但是,查看这段代码,我会检查 attribute.frame.width
值,无论它们是否有效。