Text Kit 學習

參考:
http://www.cocoachina.com/industry/20131028/7250.html
http://blog.csdn.net/iunion/article/details/12185057
http://www.jianshu.com/p/2f72a5fa99f1

“Text Kit指的是UIKit框架中用於提供高質量排版服務的一些類和協議,它讓程序能夠存儲,排版和顯示文本信息,並支持排版所需要的所有特性,包括字距調整、連寫、換行和對齊等。”

以前,如果我們想實現複雜的文本排版,例如在textView中顯示不同樣式的文本,或者圖片和文字混排,你可能就需要藉助於UIWebView或者深入研究一下Core Text。在iOS6中,UILabel、UITextField、UITextView增加了一個NSAttributedString屬性,可以稍微解決一些排版問題,但是支持的力度還不夠。現在Text Kit完全改變了這種現狀。
Text Kit是基於Core Text構建的快速、先進的文本排版和渲染引擎,並且與UIKit很好的集合。UITextView,UITextField、UILabel都已經基於Text Kit重新構建,所以它們都支持分頁文本、文本包裝、富文本編輯、交互式文本着色、文本摺疊和自定義截取等特性。所有這些UI控件現在都以同樣的方式構建,在它們後面,一個NSTextStorage對象保存着文本的主要信息,它本身是NSMutableAttributedString的子類,支持分批編輯。這就意味着你可以改變一個範圍內的字符的樣式而不用整體替換文本內容。
NSAttributedString:字符串的屬性,普通的字符串屬性. NSMutableAttributedString:字符串的屬性,可變動的字符串屬性.

Text Kit架構
下面,我們通過圖1(此圖來自WWDC2013 Session 210)來了解一下Text Kit的架構。圖1是基於iOS 7繪製的,從圖中,我們可以看到Text Kit是基於Core Text構建的,它通過Core Text與Core Graphics進行交互。而UI控件(UILabel、UITextField和UITextView)則構建於Text Kit之上,可見這些文本控件可以利用Text Kit提供的API來對文字進行排版和渲染處理。 從圖中我們也可以看到SDK提供的UIWebView是基於WebKit的,它不能使用Text Kit提供的功能。
這裏寫圖片描述
下圖顯示了Text Kit中文本的保存、渲染和現實之間的關係。
這裏寫圖片描述
1.NSTextStorage本身繼承與NSMutableAttributedString,它是以attributed string的形式保存需要渲染的文本,並在文本內容改變的時候通知到對應的layout manager對象。通常你需要創建NSTextStorage的子類來在文本改變時進行文本顯示樣式的更新。
2.NSLayoutManager作爲文本控件中的排版引擎接收保存的文本並在屏幕上渲染出來。

3.NSTextContainer描述了文本在屏幕上顯示時的幾何區域,每個text container與一個具體的UITextView相關聯。如果你需要定義一個很複雜形狀的區域來顯示文本,你可能需要創建NSTextContainer子類。

要實現我們上面描述的動態文本格式化功能,我們需要創建NSTextStorage子類以便在用戶輸入文本的時候動態的增加文本屬性。自定義了text storage後,我們需要替換調UITextView默認的text storage。
需要注意的是,你不能直接修改已有的AttributedString, 你需要把它copy出來,修改後再進行設置:

NSMutableAttributedString *labelText = [myLabel.attributedText mutableCopy]; 
[labelText setAttributes:...];
myLabel.attributedText = labelText;

Dynamic type:動態字體
iOS7增加了一項用戶偏好設置:動態字體,用戶可以通過顯示與亮度-文字大小設置面板來修改設備上所有字體的尺寸。爲了支持這個特性,意味着不要用systemFontWithSize:,而要用新的字體選擇器preferredFontForTextStyle:。iOS提供了六種樣式:標題,正文,副標題,腳註,標題1,標題2。例如:

Exclusion paths:排除路徑
iOS 上的 NSTextContainer 提供了exclusionPaths,它允許開發者設置一個 NSBezierPath 數組來指定不可填充文本的區域。
NSTextStorage:它是NSMutableAttributedString的子類,裏面存的是要管理的文本。
NSLayoutManager:管理文本佈局方式
NSTextContainer:表示文本要填充的區域

如上圖所示,它們的關係是 1 對 N 的關係。就是那樣:一個 Text Storage 可以擁有多個 Layout Manager,一個 Layout Manager 也可以擁有多個 Text Container。這些多重性帶來了多容器佈局的特性:

1)將多個 Layout Manager 附加到同一個 Text Storage 上,可以產生相同文本的多種視覺表現,如果相應的 Text View 可編輯,那麼在某個 Text View 上做的所有修改都會馬上反映到所有 Text View 上。
2)將多個 Text Container 附加到同一個 Layout Manager 上,這樣可以將一個文本分佈到多個視圖展現出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章