tableview中,根据tags不定的数量来计算collectionview的高度,从而自适应高度。找了很多方法没有成功,实现方式为,自己计算tags的高度,然后返回给tableview。计算方法:
struct TagCalculation<T: FloatingPoint> {
let widths: [T]
let maxWidth: T
let gap: T
init(widths: [T], maxWidth: T, gap: T) {
self.widths = widths
self.maxWidth = maxWidth
self.gap = gap
}
func getRows() -> [[T]] {
let arr = widths
guard arr.count > 0 else { return [] }
let a = maxWidth
var newArr: [[T]] = []
let b = [widths[0]]
newArr.append(b)
var iterator = arr.makeIterator()
var next = iterator.next()
next = iterator.next()
while next != nil {
guard let value = next else { break }
if var arr = newArr.last {
let sum = arr.reduce(value) { (result, new) -> T in
return result + new + gap
}
if sum >= a {
var newA: [T] = []
newA.append(value)
newArr.append(newA)
} else {
arr.append(value)
newArr[newArr.count - 1] = arr
}
}
next = iterator.next()
}
return newArr
}
}
let maxWidth: CGFloat = UIScreen.main.bounds.width - 15 - 15
let Templabel = UILabel(frame: .zero)
Templabel.font = UIFont(fd_fontName: .pingFangSCRegular, fd_size: 12)
let widths: [CGFloat] = calculateTags.map { (text) -> CGFloat in
Templabel.text = text
let textSize = Templabel.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: 20))
return textSize.width
}
let cal = TagCalculation(widths: widths, maxWidth: maxWidth, gap: 15 + 16)
let rows = cal.getRows()
得到的row.count为行数,乘以每行的高度,就可以得到
网友评论