专栏名称: dearmiku
iOS开发攻城狮
目录
相关文章推荐
51好读  ›  专栏  ›  dearmiku

兼容iOS与OSX的轻量级富文本处理Label (自己造的小轮子)

dearmiku  · 掘金  ·  · 2018-03-08 02:16

正文

请到「今天看啥」查看全文


兼容iOS与OSX的轻量级富文本处理Label (自己造的小轮子)

简述

最近开发的OSX应用时,一些地方需要用到图文混排,与可点击文字的地方,这时我就特别怀念在iOS用的 YYText ,然后转念一想,反正时间比较富裕就自己造一个Swift的轮子吧,所以就写了 MK_Text

目前就完成了 YYLabel 的大部分功能,但基本够用了,后续我也会去丰富里面的功能,大家有什么想法也可以提,如果我觉得比较实用我也会尽力去实现的~ 接下来我就介绍下 MK_Text 吧~

介绍

github链接: MK_Text

特性

支持图文混排,支持富文本与View混排

支持异步排版渲染

支持高亮文字设置

支持OSX 与 iOS

支持自动布局

用法

图文混排

可自定义图片显示大小,默认显示图片原始大小~

可设置图片与其所在子行的对其方式,默认为与字行中线一致~

        let imStr = NSMutableAttributedString.mk_image(im: MK_Image.init(named: NSImage.Name.init("face"))!, size: CGSize.init(width: 30, height: 30), alignType: NSMutableAttributedString.AlignType.top)
        
        //控件的用法与图片基本一致
        
        let v = UISwitch.init()
        let viewStr = NSMutableAttributedString.mk_view(view: v, superView: ml, size: v.bounds.size)
        

高亮文字

使用高亮属性时需先创建 MK_TapResponse 结构体,可选返回两个闭包: 1,高亮时的富文本属性~ 2,完成点击时回调的闭包~

这里判断点击是否完成的逻辑与Button一致~


        let tap = NSMutableAttributedString.init(string: "可点击字符")
        let response = MK_TapResponse.init(highlitedBlock: { (str) -> [NSAttributedStringKey : Any]? in
            return [NSAttributedStringKey.foregroundColor : UIColor.red]
        }) { (str, range) in
            print("点击字符串~")
        }
        tap.addTapAttr(response: response, range: nil)

对齐方式

通过 MK_Label 的 alignment属性 进行设置(默认为左对齐),此处以居中对此为例子 居中对齐效果图

提前换行

为了较好的阅读效果,有时我们需要提前换行,否则一个完整的单词就会分两行显示,就像 UILable 一样.我提供下面的属性,来实现这样的效果

    ///判断是否进行提前换行条件闭包
    ///参数一: Label要绘制的富文本
    ///参数二: 本行结尾字符的下标
    var makeNewLineEarlyConditionBlock:((NSAttributedString,Int)->(Bool)) = {(str,index)->Bool in
        return false
    }

    ///单词分隔符(单个字符)数组
    var wordSeparatorArr:[String] = [" "]

wordSeparatorArr 数组中存储着单词的分隔符,默认数组中只有" "(空格)一个元素.就如 UILabel 一样,不同单词间以空格区分

makeNewLineEarlyConditionBlock 在本行即将换行时,若存在将一个词分割为两行显示时,则会回调该闭包,来确定是否要提前换行,因为对于中文而言,则不存在这样一个字分两行显示的问题,这里使用者可以根据自己的实际情况来处理~

效果图

1,未使用提前换行

未提前换行效果图

2,使用提前换行(分隔符为" ",闭包直接返回 true )

提前换行效果图

异步渲染

通过设置 Label的 isAsync 属性来确定~ 默认为false

效果

目前只实现了上述的功能,其他功能会在后续丰富~

iOS效果图 OSX效果图

性能

关于性能我只是简单的测试了一下,和 YY_Text 比较一下,下面是为绘制所用的时间的简单对比~

性能测试结果图 性能测试结果图

这里是测试耗时的地方

MK_Text

性能测试代码图

YY_Text

性能测试代码图

测下来的结果是 MK_Text 快一些,可能是我的功能相对简单和使用 Swift 的原因吧~ 总计不算慢~

使用注意

中途修改富文本属性

若需要在修改富文本属性的同时刷新UI界面,请使用下面这个方法

public func mk_setAttrtbute(dic:[NSAttributedStringKey : Any], range: NSRange)->Void

自动布局

MK_Text 对于自动约束的支持是参照 UILabel 来做的, 当View的 translatesAutoresizingMaskIntoConstraints 为true时, 则按照View的frame进行渲染.

若为false,则会判断约束是否约束到宽高, 若约束到 则按约束的宽高进行渲染,若未约束到,则会根据渲染内容来补充宽高约束~

安装

CocoaPods

在 Podfile 中添加 pod 'MK_Text'

系统要求

OSX 10.10 或 iOS 8.0

总结

本框架测试的不多(就我一个人测),若大家发现Bug或有什么好想法 欢迎提Issues,感觉还不错的话可以点个Star (๑•ᴗ•๑)







请到「今天看啥」查看全文