兼容iOS與OSX的輕量級富文本處理Label (本身造的小輪子)

簡述

最近開發的OSX應用時,一些地方須要用到圖文混排,與可點擊文字的地方,這時我就特別懷念在iOS用的YYText,而後轉念一想,反正時間比較富裕就本身造一個Swift的輪子吧,因此就寫了MK_Textgit

目前就完成了YYLabel的大部分功能,但基本夠用了,後續我也會去豐富裏面的功能,你們有什麼想法也能夠提,若是我以爲比較實用我也會盡力去實現的~ 接下來我就介紹下MK_Text吧~github

介紹

github連接:MK_Text數組

特性

支持圖文混排,支持富文本與View混排bash

支持異步排版渲染閉包

支持高亮文字設置框架

支持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 (๑•ᴗ•๑)

相關文章
相關標籤/搜索