美文网首页
collectionView item 根据文字内容 显示大小

collectionView item 根据文字内容 显示大小

作者: writeSpace | 来源:发表于2021-06-19 16:54 被阅读0次

1、自定义UICollectionViewFlowLayout
swift代码 oc 对应的转换一下即可

import UIKit

class BLEvaluationCollectionViewLayout: UICollectionViewFlowLayout {


    override func prepare() {
        super.prepare()
        self.minimumLineSpacing = 15
        self.minimumInteritemSpacing = 10
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes:[UICollectionViewLayoutAttributes] = super.layoutAttributesForElements(in: rect)!

        let maxiMumSpace:CGFloat = self.minimumLineSpacing

        for index in 0 ..< attributes.count {
            if index ==  0 {
                let att = attributes[0]
                att.frame.origin.x = 20
                continue
            }
            let currentAtt = attributes[index]
            let preAtt = attributes[index - 1]
            if preAtt.indexPath.section == currentAtt.indexPath.section {

                let orgin:CGFloat = CGFloat(preAtt.frame.maxX)

                if currentAtt.frame.minY == preAtt.frame.minY {///在同一行
                    if orgin + maxiMumSpace + currentAtt.frame.size.width <= self.collectionViewContentSize.width - 40 {
                        var frame:CGRect = currentAtt.frame
                        frame.origin.x = orgin + maxiMumSpace
                        currentAtt.frame = frame
                    }
                }else{
                    var frame:CGRect = currentAtt.frame
                    let zeroAtt = attributes[0]
                    frame.origin.x = zeroAtt.frame.origin.x
                    currentAtt.frame = frame
                }

            }
        }
        return attributes
    }
}

2、在collectionview 初始化位置设置 layout (BLEvaluationCollectionViewLayout)
懒加载

private lazy var collectionView:UICollectionView = {
        var layout = BLEvaluationCollectionViewLayout()
        layout.minimumLineSpacing = 15
        layout.minimumInteritemSpacing = 10
        let collectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = .white
        view.addSubview(collectionView)
        return collectionView
    }()

3、对应的代理方法返回相应的size
我的字体是12 根据需求修改
也可以封装此方法

class func getSizeWithText(text:String) -> CGSize {
        let style = NSMutableParagraphStyle.init()
        style.lineBreakMode = NSLineBreakMode.byCharWrapping
        let size:CGSize = text.boundingRect(with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: 30), options: .usesLineFragmentOrigin, attributes:
                                              [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 12) ,NSAttributedString.Key.paragraphStyle:style], context: nil).size
        return CGSize.init(width: size.width + 20, height: 30)
    }

代理方法 item 大小

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       return getSizeWithText(text: dataSource[indexPath.row])
    }

完事

相关文章

网友评论

      本文标题:collectionView item 根据文字内容 显示大小

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