Swift Collectionview网格中的流布局和自动调整单元格大小
我需要在集合视图中以3xn的形式实现网格布局。一行3个单元格,可能有n行 CollectionView单元格有一个方形图像和两个标签。标签向左对齐 CollectionView应符合以下要求:Swift Collectionview网格中的流布局和自动调整单元格大小,swift,uicollectionview,autoresize,uicollectionviewflowlayout,Swift,Uicollectionview,Autoresize,Uicollectionviewflowlayout,我需要在集合视图中以3xn的形式实现网格布局。一行3个单元格,可能有n行 CollectionView单元格有一个方形图像和两个标签。标签向左对齐 CollectionView应符合以下要求: CollectionView单元格必须具有相同的宽度,但可以具有不同的高度。(取决于标签) 单元格应与collectionView的左上角对齐。也就是说,一行中的所有单元格都应该从同一y点开始。如果一行中有一个单元格,它应该与最左边对齐 我设法得到了布局,但它有一些缺陷 在单元格行之间有一些多余的多余空间
class MainCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attr = super.layoutAttributesForElements(in: rect)
var attributes = [UICollectionViewLayoutAttributes]()
for itemAttributes in attr! {
if let itemAttributesCopy = itemAttributes.copy() as? UICollectionViewLayoutAttributes {
// manipulate itemAttributesCopy
attributes.append(itemAttributesCopy)
}
}
if attributes.count == 1 {
// Set left align if only one element in collectionview
if let currentAttribute = attributes.first {
currentAttribute.frame = CGRect(x: self.sectionInset.left, y: currentAttribute.frame.origin.y, width: currentAttribute.frame.size.width, height: currentAttribute.frame.size.height)
}
} else {
var sectionHeight: CGFloat = 0
attributes.forEach { layoutAttribute in
guard layoutAttribute.representedElementCategory == .supplementaryView else {
return
}
if layoutAttribute.representedElementKind == UICollectionView.elementKindSectionHeader {
sectionHeight = layoutAttribute.frame.size.height
}
}
attributes.forEach { layoutAttribute in
guard layoutAttribute.representedElementCategory == .cell else {
return
}
if layoutAttribute.frame.origin.x == 0 {
sectionHeight = max(layoutAttribute.frame.minY, sectionHeight)
}
layoutAttribute.frame = CGRect(origin: CGPoint(x: layoutAttribute.frame.origin.x, y: sectionHeight), size: layoutAttribute.frame.size)
}
}
return attributes
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
}
这是一张说明布局的图片。如果有人能推荐任何替代解决方案或更好的解决方案,那就太好了