Text Kit 分享

iOS7 之前,幾乎所有的復(fù)雜文本都是通過 WebKit 來處理的龟再,無論 UILabel齿诞、UITextField 還是 UITextView 都在后臺以某種方式使用 webViews 來進(jìn)行文本布局和渲染咖杂。iOS7 以后宫静,蘋果提供了 TextKit 對文本進(jìn)行操作甥桂,并且對 UILabel柿究、UITextField、UITextView 都利用 TextKit 進(jìn)行了改造黄选。

前言

TextKit 簡介

TextKit是蘋果提供的一系列用于文字排版服務(wù)的類和協(xié)議的集合笛求,能夠幫助 app 存儲、布局和展示文本糕簿。TextKit 是以 CoreText 為基礎(chǔ)構(gòu)建的,所以能夠提供與 CoreText 相同的性能和能力狡孔。下圖展示了 TextKit 與 iOS 中其他文本和圖形框架的相互關(guān)系:

Text Kit 框架結(jié)構(gòu)

TextKit 在界面展示方面提供給了開發(fā)者在文本渲染之上的全部權(quán)限懂诗。

TextKit 中主要的類

TextKit 中主要包括三個類:NSTextStorage、NSLayoutManager 以及 NSTextContainer苗膝,這三個主要的類與 view 之間的關(guān)系如下圖:

Text Kit 主要類之間的關(guān)系
  • NSTextStorage是整個文本系統(tǒng)的數(shù)據(jù)來源殃恒,其管理著文本和文本屬性信息,它是NSMutableAttributedString的一個子類辱揭。
  • NSTextContainer定義了一個可以布局文本的區(qū)域离唐,并且也可以通過設(shè)置一個貝塞爾曲線數(shù)組的方式來為編輯區(qū)域設(shè)置排除區(qū)域,每個 Text View 都有一個 Text Container问窃,它精確地描述了這個可用的區(qū)域亥鬓。
  • NSLayoutManager對文本系統(tǒng)的其他部分起到協(xié)調(diào)作用,將NSTextStorage中存儲的文本信息渲染到視圖的展示區(qū)域域庇。NSLayoutManager的工作主要包括以下幾個方面:監(jiān)聽 Text Storage 中文本或?qū)傩愿淖兊耐ㄖ陡辏坏┙邮盏酵ㄖ陀|發(fā)布局進(jìn)程;將NSTextStorage中所有的字符翻譯為字形听皿;向它的 TextContainers 查詢文本可用以繪制的區(qū)域熟呛;這些區(qū)域被行逐步填充,而行又被字形逐步填充尉姨。一旦一行填充完畢庵朝,下一行開始填充;對于每一行又厉,布局管理器必須考慮斷行行為(放不下的單詞必須移到下一行)九府、連字符、內(nèi)聯(lián)的圖像附件等等覆致;當(dāng)布局完成昔逗,文本的當(dāng)前顯示狀態(tài)被設(shè)為無效,然后 Layout Manager 將前面幾步排版好的文本設(shè)給 Text View篷朵。

TextKit 中各主要部分之間的關(guān)系如下圖所示:

TextKit 中各主要部分

以編程的方式修改一個NSTextStorage對象主要有三個階段:

  1. NSTextStorage對象發(fā)送beginEditing消息來開啟接下來的一系列修改勾怒;
  2. 通過replaceCharactersInRange:withString:setAttributes:range: 方法來修改對象中存儲的字符或者字符屬性婆排,每次在調(diào)用這些方法的時候,textStorage 對象都會自動的調(diào)用edited:range:changeInLength:方法笔链;
  3. 修改結(jié)束后段只,發(fā)送endEditing消息,這樣會使 textStorage 對象向代理發(fā)送消息
    textStorage:willProcessEditing:range:changeInLength:
    并且調(diào)用對象本身的processEditing方法鉴扫,之后向代理對象發(fā)送textStorage:didProcessEditing:range:changeInLength:
    消息赞枕,最后, textStorage 對象會向其相關(guān)聯(lián)的 layout manager 對象發(fā)送
    processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:消息坪创,所有相關(guān)聯(lián)的 layout manager 會輪流通過這個消息重新計算字形位置炕婶。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莱预,隨后出現(xiàn)的幾起案子柠掂,更是在濱河造成了極大的恐慌,老刑警劉巖依沮,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涯贞,死亡現(xiàn)場離奇詭異,居然都是意外死亡危喉,警方通過查閱死者的電腦和手機(jī)宋渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辜限,“玉大人皇拣,你說我怎么就攤上這事”〉眨” “怎么了审磁?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岂座。 經(jīng)常有香客問我态蒂,道長,這世上最難降的妖魔是什么费什? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任钾恢,我火速辦了婚禮,結(jié)果婚禮上鸳址,老公的妹妹穿的比我還像新娘瘩蚪。我一直安慰自己,他們只是感情好稿黍,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布疹瘦。 她就那樣靜靜地躺著,像睡著了一般巡球。 火紅的嫁衣襯著肌膚如雪言沐。 梳的紋絲不亂的頭發(fā)上邓嘹,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音险胰,去河邊找鬼汹押。 笑死,一個胖子當(dāng)著我的面吹牛起便,可吹牛的內(nèi)容都是我干的棚贾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼榆综,長吁一口氣:“原來是場噩夢啊……” “哼妙痹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鼻疮,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤怯伊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陋守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡利赋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年水评,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚送。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡中燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塘偎,到底是詐尸還是另有隱情疗涉,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布吟秩,位于F島的核電站咱扣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涵防。R本人自食惡果不足惜闹伪,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壮池。 院中可真熱鬧偏瓤,春花似錦、人聲如沸椰憋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橙依。三九已至证舟,卻和暖如春硕旗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褪储。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工卵渴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤竹。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓浪读,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辛藻。 傳聞我的和親對象是個殘疾皇子碘橘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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

  • 卷首語 歡迎來到 objc.io 第五期! 我們希望你跟我們一樣為 iOS 7 的發(fā)布而感到興奮吱肌。選擇這個做為本期...
    評評分分閱讀 565評論 0 4
  • Text Kit學(xué)習(xí)(入門和進(jìn)階): http://www.cocoachina.com/industry/201...
    F麥子閱讀 4,024評論 1 13
  • iOS 7 引入了一個非常有用的新功能TextKit痘拆,使開發(fā)者可以通過方便的接口去修改文字的樣式和排版,而不需要直...
    星___塵閱讀 7,619評論 4 75
  • 又來壹場說走又走的旅行…收拾東西的時候氮墨,猛然地不知道該收拾什么了纺蛆,對遠(yuǎn)方也沒有太多的欣喜,但還是想迫不及待地想走出...
    傻先生閱讀 151評論 0 0
  • 如果沒有遠(yuǎn)離家鄉(xiāng)规揪,我對山的理解肯定如同我的世代居住在家鄉(xiāng)的爺爺輩一樣桥氏。認(rèn)為它無非就是圍繞在村子四周的那些。中學(xué)時地...
    一個寫字的閱讀 640評論 0 0