Self-Sizing Cell
設(shè)置預(yù)估大小
layout.estimatedItemSize=CGSize(width:100, height:25)
重寫cell方法
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
setNeedsLayout()
layoutIfNeeded()
let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var newFrame = layoutAttributes.frame
//限制寬度最大為100
newFrame.size.width = size.width > 100 ? 100 : ceil(size.width)
newFrame.size.height = ceil(size.height)
layoutAttributes.frame = newFrame
return layoutAttributes
}
這時候顯示的是這樣
非左對齊,系統(tǒng)自動調(diào)整間距
而我們想要實(shí)現(xiàn)每個cell以最小間距緊密排列
左對齊
復(fù)雜的方法是自己寫一個UICollectionViewLayout,這里我選擇了一種更簡單的方法,根據(jù)系統(tǒng)的布局來進(jìn)行調(diào)整,創(chuàng)建一個UICollectionViewLeftFlowLayout類繼承UICollectionViewFlowLayout,重寫layoutAttributesForElements(in rect:CGRect)方法
class UICollectionViewLeftFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attrsArry = super.layoutAttributesForElements(in: rect) else {
return nil
}
for i in 0..<attrsArry.count {
if i != attrsArry.count-1 {
let curAttr = attrsArry[i] //當(dāng)前attr
let nextAttr = attrsArry[i+1] //下一個attr
//如果下一個在同一行則調(diào)整,不在同一行則跳過
if curAttr.frame.minY == nextAttr.frame.minY {
if nextAttr.frame.minX - curAttr.frame.maxX > minimumInteritemSpacing{
var frame = nextAttr.frame
let x = curAttr.frame.maxX + minimumInteritemSpacing
frame = CGRect(x: x, y: frame.minY, width: frame.width, height: frame.height)
nextAttr.frame = frame
}
}
}
}
return attrsArry
}
}
最終效果如下
左對齊,間距為最小間距