Swift 如何優雅的構建富文本

前言

iOS開發中 富文本是咱們經常使用的特性, 面對"花裏胡哨"的文本設計, FoundationNSAttributedString爲咱們提供了很是大的幫助, 但他的缺點也難免給咱們帶來了不少困擾 例如: 繁瑣的API、處理交互需求的麻煩等, 爲了解決平常開發中使用富文本的一些痛點, 我設計了AttributedString, 充分利用Swift語音的特性 簡化富文本構建過程, 並擴展出更加優雅的交互處理, 自定義視圖插入等等.git

能解決哪些問題

1. 繁瑣的建立過程

  • 簡單的富文本

普通建立方式

AttributedString

  • 帶有段落樣式的富文本

普通建立方式

AttributedString

  • 圖文混排的富文本

普通建立方式

AttributedString

這裏有一個點要說一下, 附件位置的計算方式目前網絡上不少都是 -4 -2什麼的都是不正確的, 字號一旦加大或者減少就都沒法準確居中了, 有須要的小夥伴能夠看一下我內部的實現 應該是全網最準確的了, 原理很少解釋, 之後有機會單獨寫一篇講解. 🕊github

2. 常見的點擊交互

原生的實現方式僅UITextView支持, 也僅僅侷限於URLNSTextAttachment類型.正則表達式

UILabel 想要支持點擊等交互的實現方式有不少種, 這裏很少細說. 總之若是想實現點擊和長按等觸發方式, 以及各類內容類型的監聽和高亮樣式的顯示成本仍是比較大的.swift

原生方式
原生方式

AttributedString監聽方式

上面使用的是AttributedString的監聽方式獲得點擊的回調, 還有另外一種action屬性的方式 下面簡單展現一下.網絡

AttributedString-Action-Click

再來一個長按觸發的.異步

AttributedString-Action-Press

大概就是這樣子, 交互相關的就演示到這裏, 還有高亮樣式的設置等等特性能夠到Demo中去發掘.spa

3. 指定內容的高亮

好比想將文本中的電話號碼單獨設置字號和字色:設計

原生方式(太長了 只截局部)

AttributedString-Checking

固然正則表達式確定不能少:3d

原生方式(太長了 只截局部)

AttributedString-Checking

4. 插入自定義視圖

這裏就不說原生怎麼實現了 由於太麻煩了, 涉及到的點不少, 這裏只展現一下AttributedString如何向UITextView添加自定義視圖.code

AttributedString-ViewAttachment

咳咳.. 是否是太簡單了? 其實它和附件的性質同樣, 在AttributedString中它叫ViewAttachment. 具體位置和大小的設置與其餘附件一致. 具體參見AttributedString.Attachment.Style.

其餘問題

如何從中獲取NSAttributedString對象?

let string: NSAttributedString = AttributedString("LEE").value
複製代碼

是否有代碼入侵?

目前所有基於extensionUIKit的相關控件進行功能的實現, 力求作到最小化的影響.

如何追加 拼接富文本?

AttributedString中有完善的 + +=運算符擴展.

同時還支持 String + AttributedStringNSAttributedString + AttributedString 等操做.

只支持iOS平臺嗎?

AttributedString 實際是對 NSAttributedString 原生特性的一種封裝, 同時增長了不少新的特性, 理論上 NSAttributedString 所支持的平臺 AttributedString 都支持, 固然少部分特性除外. 例如 watchOS 就沒有附件(NSTextAttachment).

總的來講目前 AttributedString 對於iOStvOSmacOSwatchOS都是支持的.

將來還會增長哪些新特性?

不少 目前在計劃中的包括: 表情解析器, 異步渲染(須要構建一個新的UIView子類)等等.

若是你有什麼好的建議能夠在Github中發起Issues.

不太懂 能講講實現原理嗎?

固然沒問題, 等下一篇咯.

咕咕咕

說點自身所想吧

衆所周知 YYTextOC中一款很是優秀的富文本庫, 他表明了一個時代, 但目前彷佛已經沒有再維護了, 積累了不少Issues沒法獲得解決.

並且在Swift中使用OC的庫很難發揮出其語言該有的特性. 恰巧在Swift中尚未一款可以媲美 YYText 的富文本庫, 這一直是之前困擾個人點, 也是我創造AttributedString的出發點. 不能說如今AttributedString就能媲美YYText怎麼樣怎麼樣.. 畢竟還有不少工做要作, 但我會以YYText爲標杆, 作到Swift中的"YYText" 甚至更好. 感謝你們的支持.

總結

經過上面一些簡單的對比, 能夠很明顯看出總體代碼的簡化程度, 越是複雜的富文本 代碼量的體現越是明顯, 總體可讀性也沒有問題, 編寫時的調用體驗也很友好.

若是你以爲還不錯 不妨來一波 Star Fork Share 素質三連[滑稽]~

AttributedString

相關文章
相關標籤/搜索