TextKit官方文檔閱讀筆記

iOS中文本控件的底層是TextKit,它能夠精細地排版與布局文本
TextKit是對CoreText的封裝(如下圖),所以有同樣的性能


image.png

image.png

在TextKit中,NSTextStorage存儲了顯示在TextViews中的string,文本的布局是由NSLayoutManager來處理的,文本的布局區(qū)域由于NSTextContainer定義

NSTextContainer:

NSTextContainer定義了一個區(qū)域,文本在該區(qū)域內(nèi)布局,一般是矩形,也可以創(chuàng)建NSTextContainer的子類來自定義為其他形狀

NSTextStorage:

NSTextStorage是NSMutableAttributedString的子類 ,存儲著string和Attribute,你可以把它看做TextKit的數(shù)據(jù)庫,另外它還管理者一組NSLayoutManager對象,因為當文本改變的時候需要通知NSLayoutManager

NSLayoutManager:

NSLayoutManager管理NSTextStorage和NSTextContainer,它負責把NSTextStorage中的文本顯示出來,把字符轉(zhuǎn)為字形,管理布局

2.Text Attributes

Text Kit可以處理三種文本屬性:字符屬性(Character Attributes),段落屬性(Paragraph Attributes)和文檔屬性(Document Attributes)聋丝。

2.1字符屬性(Character Attributes)

addAttribute:value:range://你可以用該方法給文本添加屬性
drawGlyphsForGlyphRange:atPoint//如果需要自定義屬性,就需要實現(xiàn)NSLayoutManager子類并且重寫該方法

2.1字符屬性(Paragraph Attributes)

很簡單: 使用NSParagraphStyle添加段落屬性

3.1文檔屬性(Document Attributes)

initWithRTF:documentAttributes://文本系統(tǒng)沒有其他的機制存儲文檔屬性,就提供了該方法初始化的時候設置

改變Text Storage

//一共3步
1.`[beginEditing]`
2.改變文本屬性,比如`setAttributes:range:`,當執(zhí)行完第一步后,
//每當你改變文本屬性的時候,
//text storage對象都會調(diào)用edited:range:changeInLength:方法來跟蹤修改
3.`[endEditing]`//這時候text storage會
//調(diào)用代理方法[textStorage:willProcessEditing:range:changeInLength:],
//然后調(diào)用它自己的[processEditing](fixing attributes within the recorded range of changed characters)
//再調(diào)用代理[textStorage:didProcessEditing:range:changeInLength:]給代理一個機會驗證或改變文本屬性
//最后發(fā)送[processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:]給所有的layout manager,layout managers用這些信息重新計算字形的位置,重新顯示

3.Laying out Text

NSLayoutManager是TextKit的中央控制系統(tǒng),在MVC中,NSLayoutManager就是C, NSTextStorage是M, NSTextContainer其實也是M,因為它存儲了視圖顯示的區(qū)域, UITextView是V, NSLayoutManager干以下事情:

  • 控制text storage 和text container
  • 從characters生成glyphs
  • 計算字形的位置并且保存信息
  • 管理字形和字符的范圍
  • 在text view中繪制glyphs
  • 計算文本行的邊框矩形
  • 控制連字符
  • 操作字符屬性和字形屬性

4.The Layout Process

Layout Manager執(zhí)行布局分為2步:字形生成和字形布局,

5.Generating Line Fragment Rectangles

layout manager 會使用[lineFragmentRectForProposedRect:atIndex:writingDirection:remainingRect:]方法像text container 獲得一個矩形區(qū)域用來放置文本(Line Fragment Rectangles),然后會根據(jù)lineFragmentPadding屬性來調(diào)整該矩形區(qū)域的padding(不要使用該屬性來調(diào)整整個文檔的邊距),
除了返回Line Fragment Rectangles還會返回一個叫做used rectangle的矩形區(qū)域,這兩個矩形都包括了lineFragmentPadding和interline space,但是段落間距僅僅包含在Line Fragment Rectangles中,used rectangle沒有

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末思瘟,一起剝皮案震驚了整個濱河市像云,隨后出現(xiàn)的幾起案子怖现,更是在濱河造成了極大的恐慌蕴茴,老刑警劉巖琉预,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件董饰,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機卒暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門啄栓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人也祠,你說我怎么就攤上這事昙楚。” “怎么了齿坷?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵桂肌,是天一觀的道長。 經(jīng)常有香客問我永淌,道長崎场,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任遂蛀,我火速辦了婚禮谭跨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘李滴。我一直安慰自己螃宙,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布所坯。 她就那樣靜靜地躺著谆扎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芹助。 梳的紋絲不亂的頭發(fā)上堂湖,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音状土,去河邊找鬼无蜂。 笑死,一個胖子當著我的面吹牛蒙谓,可吹牛的內(nèi)容都是我干的斥季。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼累驮,長吁一口氣:“原來是場噩夢啊……” “哼酣倾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谤专,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灶挟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毒租,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年墅垮,在試婚紗的時候發(fā)現(xiàn)自己被綠了惕医。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡算色,死狀恐怖抬伺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灾梦,我是刑警寧澤峡钓,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站若河,受9級特大地震影響能岩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萧福,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一拉鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲫忍,春花似錦膏燕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至射亏,卻和暖如春近忙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸦泳。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工银锻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人做鹰。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓击纬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钾麸。 傳聞我的和親對象是個殘疾皇子更振,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • TextKit 的基本介紹 TextKit is a full-featured, high-level set ...
    Laughingg閱讀 1,146評論 0 1
  • 版本記錄 前言 TextKit框架是對Core Text的封裝,用簡潔的調(diào)用方式實現(xiàn)了大部分Core Text的功...
    刀客傳奇閱讀 5,040評論 2 19
  • iOS 7 引入了一個非常有用的新功能TextKit饭尝,使開發(fā)者可以通過方便的接口去修改文字的樣式和排版肯腕,而不需要直...
    星___塵閱讀 7,637評論 4 75
  • 卷首語 歡迎來到 objc.io 第五期! 我們希望你跟我們一樣為 iOS 7 的發(fā)布而感到興奮钥平。選擇這個做為本期...
    評評分分閱讀 565評論 0 4
  • 原文參考 一实撒、 基本的TextKit對象 NSTextStorage 存儲用于顯示的文本。 NSLayoutMan...
    Rui哥閱讀 894評論 0 0