美文网首页
swift 列表中,collectionview表达tags,c

swift 列表中,collectionview表达tags,c

作者: 松龄学编程 | 来源:发表于2020-06-08 14:23 被阅读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为行数,乘以每行的高度,就可以得到

    相关文章

      网友评论

          本文标题:swift 列表中,collectionview表达tags,c

          本文链接:https://www.haomeiwen.com/subject/glxrtktx.html