TextKit

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 架構(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中重要的一些對象

textkitarchitecture_2x.png
  • 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)


4196_131113102852_1.jpg

將文字顯示為多列挡毅,或多頁

4196_131113102904_1.jpg

不同的排版方式蒜撮,則可以使用多個NSLayoutManager

4196_131113102915_1.jpg

** 排版渲染實現(xiàn)的過程 **
通過形象的方式,對UITextView的組成做了分解跪呈。通常段磨,我們在設(shè)備上只能看到最右邊的文本顯示界面,而內(nèi)部的 NSTextStorage耗绿、NSLayoutManager 和 NSTextContainer 是看不出來的苹支。通常由NSLayoutManager 從 NSTextStorage 中讀取出文本數(shù)據(jù),然后根據(jù)一定的排版方式误阻,將文本排版到NSTextContainer中沐序,再由NSTextContainer結(jié)合UITextView將最終效果顯示出來。

4196_131113102949_1.jpg

注意點
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]; 
4196_131028122737_1.png

Text container能夠處理擊中測試(hit tests),所以可以定位到點擊的字符在文本中的位置遭殉。 此外它還提供一些代理方法讓開發(fā)者能夠自己定義鏈接點擊后的處理事件石挂。

Text Kit下面四個特性
動態(tài)字體(Dynamic type)

動態(tài)字體是iOS7中新增加的比較重要的特性之一,程序應(yīng)該按照用戶設(shè)定的字體大小和粗細來顯示文本內(nèi)容恩沽。
分別在設(shè)置\通用\輔助功能和設(shè)置\通用\文字大小中可以設(shè)置文本在應(yīng)用程序中顯示的粗細和大小誊稚。

4196_131028122854_1-2.jpg

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


4196_131028122930_1.png

為了讓我們的程序支持動態(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就可以了迷帜。

iOS 7 教程:淺析Text Kit
Text Kit學(xué)習(xí)(入門和進階)
字符串渲染

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市色洞,隨后出現(xiàn)的幾起案子戏锹,更是在濱河造成了極大的恐慌,老刑警劉巖火诸,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦针,死亡現(xiàn)場離奇詭異,居然都是意外死亡置蜀,警方通過查閱死者的電腦和手機奈搜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盯荤,“玉大人馋吗,你說我怎么就攤上這事∏锍樱” “怎么了宏粤?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灼卢。 經(jīng)常有香客問我绍哎,道長,這世上最難降的妖魔是什么鞋真? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任崇堰,我火速辦了婚禮,結(jié)果婚禮上灿巧,老公的妹妹穿的比我還像新娘赶袄。我一直安慰自己揽涮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布饿肺。 她就那樣靜靜地躺著蒋困,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬辣。 梳的紋絲不亂的頭發(fā)上雪标,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音溉跃,去河邊找鬼村刨。 笑死,一個胖子當(dāng)著我的面吹牛撰茎,可吹牛的內(nèi)容都是我干的嵌牺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼龄糊,長吁一口氣:“原來是場噩夢啊……” “哼逆粹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炫惩,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤僻弹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后他嚷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋绽,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年筋蓖,在試婚紗的時候發(fā)現(xiàn)自己被綠了卸耘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扭勉,死狀恐怖鹊奖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涂炎,我是刑警寧澤忠聚,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站唱捣,受9級特大地震影響两蟀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜震缭,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一赂毯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦党涕、人聲如沸烦感。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽手趣。三九已至,卻和暖如春肥荔,著一層夾襖步出監(jiān)牢的瞬間绿渣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工燕耿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留中符,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓誉帅,卻偏偏與公主長得像淀散,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堵第,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容