UIMutiLineLabel的绘制


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

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容