UIMutiLineLabel的绘制

2023-05-23  本文已影响0人  那年那月那花儿

typealias UIMultilineBlock = (CGPoint) -> Void

class UIMultilineLabel: UIView {

    open var block: UIMultilineBlock?


    open var text: String? {

        didSet {

            refreshContent()

        }

    }

    open var font: UIFont? {

        didSet {

            refreshContent()

        }

    }

    open var textColor: UIColor? {

        didSet {

            refreshContent()

        }

    }

    open var textIndent: CGFloat? {

        didSet {

            refreshContent()

        }

    }


    fileprivate(set) var endOffSet: CGPoint = CGPoint.zero


    override var frame: CGRect {

        didSet {

            contentLab.frame = self.bounds

        }

    }


    override init(frame: CGRect) {

        super.init(frame: frame)

    }


    convenience init(text: String? = "",

                    font: UIFont? = UIFont.systemFont(ofSize: 15),

                    textColor: UIColor? = UIColor.black,

                    textIndent: CGFloat? = 0,

                    printBlock: UIMultilineBlock? = nil) {

        self.init()

        self.addSubview(contentLab)

        self.text = text

        self.font = font

        self.textColor = textColor

        self.textIndent = textIndent

        self.block = printBlock

        refreshContent()

    }



    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }


    lazy private var contentLab: UILabel = {

        let label = UILabel()

        label.numberOfLines = 0

        return label

    }()

}

extension UIMultilineLabel {

    private func refreshContent() {

        guard let test = text else { return }

        let paraStyle = NSMutableParagraphStyle()

        paraStyle.alignment = .left

        if let firstLineHeadIndent  = textIndent {

            paraStyle.firstLineHeadIndent = firstLineHeadIndent

        }

        var dic: [NSAttributedString.Key : Any]? = [NSAttributedString.Key.paragraphStyle: paraStyle]

        if let testColor = textColor {

            dic?[NSAttributedString.Key.foregroundColor] = testColor

        }

        if let testFont = font {

            dic?[NSAttributedString.Key.font] = testFont

        }


        contentLab.attributedText = NSAttributedString(string: test, attributes: dic)


        let lineWholeSize = textSize(text: test, font: font ?? UIFont.systemFont(ofSize: 15), width: CGFloat(MAXFLOAT), height: 20)

        print(lineWholeSize)

        let lineSingleSize = textSize(text: test, font: font ?? UIFont.systemFont(ofSize: 15), width: 393, height: CGFloat(MAXFLOAT))

        print(lineSingleSize)

        let indent = textIndent ?? 0

        if lineWholeSize.width + indent <= lineSingleSize.width {

            // 没有换行

            endOffSet = CGPointMake(contentLab.frame.origin.x + lineWholeSize.width + indent, contentLab.frame.origin.y)

        } else {

            // 已经换行

            let a = Int((lineWholeSize.width + indent) / lineSingleSize.width)

            let distance = lineWholeSize.width + indent - lineSingleSize.width * CGFloat(a)

            let x = distance

            let y = lineSingleSize.height - lineWholeSize.height

            endOffSet = CGPointMake(x, y)

        }

        block?(endOffSet)

    }


    private func textSize(text: String, font: UIFont, width: CGFloat, height: CGFloat) -> CGSize {

        return text.boundingRect(with: CGSize(width: width, height: height), options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).size

    }

}

上一篇 下一篇

猜你喜欢

热点阅读