swift 列表中,collectionview表达tags,c

2020-06-08  本文已影响0人  松龄学编程

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为行数,乘以每行的高度,就可以得到

上一篇下一篇

猜你喜欢

热点阅读