美文网首页
UIMutiLineLabel的绘制

UIMutiLineLabel的绘制

作者: 那年那月那花儿 | 来源:发表于2023-05-23 14:09 被阅读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

    }

}

相关文章

  • Objective-C ios图形各种线条绘制

    IOS 图形绘制 绘制直线 矩形绘制 三角形绘制 任意弧形绘制 圆形绘制 绘制的属性 虚线的绘制 UIView d...

  • 015 几何形状绘制

    几何形状绘制 绘制直线 绘制圆 绘制矩形 绘制椭圆 填充几何形状 OpenCV没有专门的填充方法,只是把绘制几何形...

  • SVG

    SVG 绘制长方形绘制圆形绘制椭圆 绘制直线 绘制折线 绘制多边形 ...

  • Canvas使用方法总结

    引入Canvas标签 绘制直线 绘制矩形 绘制圆弧 绘制文本 绘制图片 我的github:https://gith...

  • View的面试锦囊

    View的draw流程 绘制背景 绘制自己 绘制子View 绘制装饰 View.getLocationInWind...

  • Android绘制(二):来用Path绘出想要的图形吧!

    Android绘制(一):来用shape绘出想要的图形吧! 目录 前言 绘制线 绘制图形 绘制弧 绘制文字 组合 ...

  • 不同角色各种“鼻子”该怎么画?

    这就是Jane Mere通常绘制的鼻子绘制方法。 通过简化实际绘制的鼻子阴影来绘制变形的鼻子。绘制变形的图片时,考...

  • UI设计超真实手机里的钢琴图标

    1、绘制钢琴图标轮廓。 2、绘制钢琴的整体轮廓。 3、绘制盖子和内部细节。 4、绘制钢琴身部的细节。 5、绘制钢琴...

  • Android 双缓冲实现画图板工具类

    程序先将绘制的内容绘制到Bitmap图片缓冲区上,再将Bitmap绘制到View上,防止此前绘制内容的消失绘制工具...

  • 使用canvas绘制圆形进度条

    实现步骤: 绘制一个圆; 绘制圆环; 绘制进度环; 绘制文字; 一、创建画布 二、绘制一个圆 三、绘制圆环: 四、...

网友评论

      本文标题:UIMutiLineLabel的绘制

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