TextKit 的基本介紹
TextKit is a full-featured, high-level set of classes for handling text and fine typography. Using TextKit, you can lay out styled text into paragraphs, columns, and pages; you can flow text around arbitrary regions such as graphics; and you can use it to manage multiple fonts. If you were considering using Core Text to implement text rendering, you should consider TextKit instead. TextKit is integrated with all UIKit text-based controls to enable apps to create, edit, display, and store text more easily—and with less code than was previously possible in iOS.
TextKit是一個全功能的,高級組類來處理文字和排版前塔。使用TextKit,您可以列出樣式文本段落,列,和頁面,你可以在任意流文本區(qū)域如圖形;你可以用它來管理多個字體孤钦。如果你正在考慮使用核心文本實現(xiàn)文本渲染,你應(yīng)該考慮TextKit代替醉鳖。TextKit是結(jié)合所有UIKit文本控件啟用應(yīng)用程序來創(chuàng)建赊窥、編輯、顯示和存儲文本更多地被拋棄在iOS比以前更少的代碼夺脾。
TextKit comprises new UIKit classes, along with extensions to existing classes, including the following:
TextKit包含新的UIKit類,擴展現(xiàn)有的類,包括以下:
The NSAttributedString class has been extended to support new attributes.
已經(jīng)擴展為支持新屬性
The NSLayoutManager class generates glyphs and lays out text.
生成符號和列出了文本
The NSTextContainer class defines a region where text is laid out.
定義了一個文本布局區(qū)域
The NSTextStorage class defines the fundamental interface for managing text-based content.
定義了基本的界面來管理基于文本的內(nèi)容疗隶。
For more information about TextKit, see Text Programming Guide for iOS.
更多的信息請查看 TextKit Text Programming Guide for iOS摔握。
TextKit的架構(gòu)分析
TextKit 是apple 在iOS7 中引入的键耕。是一個開速而且現(xiàn)代化的文字排版和渲染引擎寺滚。
TextKit 的引入主要是為了減小圖文混排的難度。
復(fù)雜的 圖文混排必須使用 CoreText 來實現(xiàn)屈雄。TextKit 是 CoreText 的封裝村视。
可以從圖中看出,原生的文本控件都是構(gòu)建在TextKit之上的酒奶,使用TextKit進行排版和渲染蚁孔。而UIWebView是構(gòu)建在WebKit上的奶赔,不能使用TextKit功能。
TextKit的作用
兩個最重要的功能:
- 文字排版
- 文字渲染
Text Kit中重要的一些對象
- TextView: 主要是指 UILable勒虾, UITextField纺阔, UITextView瘸彤。 主要是 UITextView
- TextContainer: 對應(yīng) TextKit 中的 NSTextContainer 修然,NSTextContainer 定義的是一塊可以排版的區(qū)域。(一般是矩形區(qū)域质况,也可以自己定制愕宋,圓, 橢圓)
- Layout manager: 對應(yīng)著 NSLayoutManager结榄。主要是用來處理文字的排版工作中贝。—— 通過將 TextStorage 存儲的文字信息按照規(guī)范顯示到對應(yīng)的 TextContainers 區(qū)域臼朗。
- **Textstorage: ** 對應(yīng)著 NSTextStorage 類邻寿,定義了一些基本的存儲機制。用來存儲文本和文本相關(guān)的屬性视哑。存儲的信息發(fā)送變化的時候绣否,通知布局對象進行布局調(diào)整。
** NSTextStorage NSLayoutManager NSTextContainer 的對應(yīng)關(guān)系**
一一對應(yīng)
將文字顯示為多列挡毅,或多頁
不同的排版方式蒜撮,則可以使用多個NSLayoutManager
** 排版渲染實現(xiàn)的過程 **
通過形象的方式,對UITextView的組成做了分解跪呈。通常段磨,我們在設(shè)備上只能看到最右邊的文本顯示界面,而內(nèi)部的 NSTextStorage耗绿、NSLayoutManager 和 NSTextContainer 是看不出來的苹支。通常由NSLayoutManager 從 NSTextStorage 中讀取出文本數(shù)據(jù),然后根據(jù)一定的排版方式误阻,將文本排版到NSTextContainer中沐序,再由NSTextContainer結(jié)合UITextView將最終效果顯示出來。
注意點
Text Kit 是基于 Core Text 構(gòu)建的快速堕绩、先進的文本排版和渲染引擎策幼,并且與UIKit很好的集合。UITextView奴紧,UITextField特姐、UILabel 都已經(jīng)基于Text Kit 重新構(gòu)建,所以它們都支持分頁文本黍氮、文本包裝唐含、富文本編輯浅浮、交互式文本著色、文本折疊和自定義截取等特性捷枯。所有這些UI控件現(xiàn)在都以同樣的方式構(gòu)建滚秩,在它們后面,一個NSTextStorage對象保存著文本的主要信息淮捆,它本身是 NSMutableAttributedString 的子類郁油,支持分批編輯。這就意味著你可以改變一個范圍內(nèi)的字符的樣式而不用整體替換文本內(nèi)容攀痊。
self.textView.textStorage.beginEditing()
// 在這中間修改部分內(nèi)容
// self.mark(Word:"Alice" inTextStorage: self.textView.textStorage)
self.textView.textStorage.endEditing()
Text storage管理者一系列的NSLayoutManager對象桐腌。
當(dāng)它的字符或者屬性改變時會通知到自己所管理的layout Manager對象以便它們作出相應(yīng)的反應(yīng)。在layout manager上面是一個NSTextContainer對象苟径,用于為layout manager定義坐標(biāo)系和一些幾何特性案站。例如,如果你想UITextView中的文本環(huán)繞在一張圖片四周棘街,你可以給text container設(shè)定一個排除路徑(exclusion path)蟆盐。
UIBezierPath *exclusion = ButterflyBezierPath;
self.textView.textContainer.exclusionPaths = @[exclusion];
Text container能夠處理擊中測試(hit tests),所以可以定位到點擊的字符在文本中的位置遭殉。 此外它還提供一些代理方法讓開發(fā)者能夠自己定義鏈接點擊后的處理事件石挂。
Text Kit下面四個特性
動態(tài)字體(Dynamic type)
動態(tài)字體是iOS7中新增加的比較重要的特性之一,程序應(yīng)該按照用戶設(shè)定的字體大小和粗細來顯示文本內(nèi)容恩沽。
分別在設(shè)置\通用\輔助功能和設(shè)置\通用\文字大小中可以設(shè)置文本在應(yīng)用程序中顯示的粗細和大小誊稚。
iOS7對系統(tǒng)字體在顯示上做了一些優(yōu)化,讓不同大小的字體在屏幕上都能清晰的顯示罗心。通常用戶設(shè)置了自己偏好的字體里伯,他們希望在所有程序中都看到文本顯示是根據(jù)他們的設(shè)定進行調(diào)整。為了實現(xiàn)這個渤闷,開發(fā)者需要在自己的應(yīng)用中給文本控件設(shè)置當(dāng)前用戶設(shè)置字體疾瓮,而不是指定死字體及大小§可以通過UIFont中新增的preferredFontForTextStyle:方法來獲取用戶偏好的字體狼电。
iOS7中給出了6中字體樣式供選擇:
UIFontTextStyleHeadline
UIFontTextStyleBody
UIFontTextStyleSubheadline
UIFontTextStyleFootnote
UIFontTextStyleCaption1
UIFontTextStyleCaption2
為了讓我們的程序支持動態(tài)字體,需要按一下方式給文本控件(通常是指UILabel弦蹂,UITextField肩碟,UITextView)設(shè)定字體:
self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
這樣設(shè)置之后,文本控件就會以用戶設(shè)定的字體大小及粗細顯示凸椿,但是如果程序在運行時削祈,用戶切換到設(shè)置里修改了字體,這是在切回程序,字體并不會自動跟著變髓抑。這時就需要我們自己來更新一下控件的字體了咙崎。
在系統(tǒng)字體修改時,系統(tǒng)會給運行中的程序發(fā)送UIContentSizeCategoryDidChangeNotification通知吨拍,我們只需要監(jiān)聽這個通知褪猛,并重新設(shè)置一下字體即可。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredContentSizeChanged:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
- (void)preferredContentSizeChanged:(NSNotification *)notification{
self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}
當(dāng)然羹饰,有的時候要適應(yīng)動態(tài)修改的字體并不是這么設(shè)置一下就完事了伊滋,控件的大小可能也需要進行相應(yīng)的調(diào)整,這時我們程序中的控件大小也不應(yīng)該寫死严里,而是需要根據(jù)字體大小來計算.
凸版印刷體效果(Letterpress effects)
凸版印刷替效果是給文字加上奇妙陰影和高光新啼,讓文字看起有凹凸感追城,像是被壓在屏幕上刹碾。當(dāng)然這種看起來很高端大氣上檔次的效果實現(xiàn)起來確實相當(dāng)?shù)暮唵危恍枰oAttributedString加一個NSTextEffectAttributeName屬性座柱,并指定該屬性值為NSTextEffectLetterpressStyle就可以了迷帜。