YYText之圖文混排

YYText之圖文混排

1.圖文混排的原理?

我覺得,查看代碼前,最重要的一件事是知道圖文混排到底是怎么實現的。

核心思想:生成富文本時把,一張圖片先用一個占位符代替。實際渲染時,圖片占位符的渲染處理會更多一些。

根據這個原理,我們開始深入的學習。本文Demo基于YYKitExample。

2.YYTextAttachmentExample

我們先看YYTextAttachmentExample.m中的代碼實現。self.view上有3個富文本,并且末尾都帶了圖片。我們可以看出,設置富文本的核心方法如下,深入看看其中做了什么。

+ (NSMutableAttributedString *)attachmentStringWithContent:(id)content
                                               contentMode:(UIViewContentMode)contentMode
                                            attachmentSize:(CGSize)attachmentSize
                                               alignToFont:(UIFont *)font
                                                 alignment:(YYTextVerticalAlignment)alignment;

結合代碼運行流程,我們分為以下幾個部分:

2.1 生成NSMutableAttributedString實例

初始化時提供了一個占位符@"\uFFFC",用于代替圖片信息。

2.2 YYTextAttachment

說到圖文混排,必然會用到NSTextAttachment,它是NSAttributedString的類簇,設置富文本時對應的key是NSAttachmentAttributeName。簡而言之,我們給一個NSAttributedString實例添加圖片時,就是將image實例作為以上key的value。YYText自身實現了一個YYTextAttachment,作者是這么介紹的:

YYTextAttachmentNSAttributedString的類簇,它的實例作為富文本key屬性YYTextAttachmentAttributeName的value。當富文本包含YYTextAttachment時,它會采用文本規則展示。比如,attachment的內容是UIImage時,它會被繪制為CGContext;attachment的內容是UIViewCALayer時,它會被加入到text containerview層或layer層上。

2.3 YYTextRunDelegate

在這之前我們先要知道,NSAttributedString相比于NSString多了很多attribute的概念,比如下劃線、背景色等。每個字符都有一個字符區域,渲染每個字符多種多樣的attributes都是在這個區域的基礎上的。轉換成代碼是什么意思呢?CoreText的為我們提供了這個體系:

CTFrame.jpg

NSAttributedString初始化后會生成CTFramesetterCTFramesetter根據不同的CGPath生成對應的CTFrame,一個CTFrame由多行CTLine組成,一個CTLine會包含多個CTRun(字形繪制的最小單元)。
結合之前說的繪制的核心思想,可以這么理解:一行帶有文字和圖片的富文本,包含若干個CTRun繪制單元,圖片的繪制單元相對特殊一些。為什么呢?因為CoreText并不能直接將一個圖片轉換為CTRun來繪制,所以它先用占位符預留空間,而真正的圖片繪制是交給CoreGraphics完成的。
問題又來了,CoreGraphics是如何拿到這些繪圖信息(descent、ascent、width等)呢?到這終于引出了CTRunDelegate。我們為富文本的kCTRunDelegateAttributeName屬性賦值一個CTRunDelegate實例,CoreText可以根據它拿到它內部的屬性,如descent、ascent、width等。

2.4 小結

通過以上3個步驟,一個富文本就生成了。其中涉及到了CoreText的許多類,尤其是NSTextAttachmentCTRunDelegate。還有,富文本的文本結構。詳細內容,推薦《Text Programming Guide for iOS》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 系列文章: CoreText實現圖文混排 CoreText實現圖文混排之點擊事件 CoreText實現圖文混排之文...
    老司機Wicky閱讀 40,318評論 221 432
  • CoreText是一個進階的比較底層的布局文本和處理字體的技術,CoreText API在OS X v10.5 和...
    smalldu閱讀 13,597評論 18 129
  • 最近在網上看了一些大牛的文章,自己也試著寫了一下,感覺圖文混排真的很強大。 廢話不多說,開始整 先上效果圖跟代碼,...
    AllureJM閱讀 1,025評論 0 1
  • blog.csdn.net CoreText實現圖文混排 - 博客頻道 CoreText實現圖文混排 也好久沒來寫...
    K_Gopher閱讀 620評論 0 0
  • 1,早上看了菜頭以前寫的一篇文章《怪物都在北京上海深圳》,讀完后我扭了扭頭想著,我不就在深圳咩。說起來我來深圳已經...
    撩姬s閱讀 301評論 0 7