來源:http://iosdeveloper.diandian.com/post/2012-11-16/40041182749
Core Text是iOS 3.2+和OSX 10.5+的文本渲染引擎,可以讓你自由的控制文字格式設定和排版。
Core Text不同於UIKit和Core Graphics/Quartz(雖然通過後兩者你也可以進行文字渲染):
在UIKit中,你可以使用UILabel來顯示文字,它的操作非常簡單,但是你沒有辦法控制UILabel中單獨一個字元的字型顏色。也就是說,沒有辦法進行富文本的顯示。
在Core Graphics/Quartz中你可以非常漂亮的做系統所能做的每一件事,但是你必須要自己計算每個字元的位置,然後再把它渲染到螢幕上。也就是說它無法進行文字排版。
Core Text 正是以上兩點的結合。你既可以控制文字的位置、布局、顏色、大小等等屬性,又不需要實際操心字元位置、文字斷行等瑣事。
Core Text物件模型這裡簡單介紹一下Core Text渲染文本的一些基本概念,以便有助於理解CoreText的工作機制。
是Core Text物件模型:
我們通過NSAttributedString建立一個CTFramesetter,這時候會自動建立一個 CTTypesetter執行個體,它負責管理字型,下面通過CTFramesetter來建立一個或多個frame來渲染文字。然後Core Text會根據frame的大小自動建立CTLine(每行對應一個CTLine)和CTRun(相同格式的一個或多個相鄰字元組成一個CTRun)。
文檔原文解釋:
A line object contains glyph-run objects, represented by the CTRun opaque type. A glyph run is a set of consecutive glyphs sharing the same attributes and direction. The typesetter creates glyph runs as it produces lines from character strings, attributes,
and font objects. That is, a line is constructed of one or more glyphs runs. Glyph runs can draw themselves into a graphic context, if desired, although most clients have no need to interact directly with glyph runs. Figure 1-4 shows the conceptual hierarchy
of a frame object containing line objects that, in turn, contain glyph-run objects.
Figure 1-4 A frame object containing lines and glyph runs
舉例來說,Core Text將建立一個CTRun來繪製一些紅色文字,然後建立一個CTRun來繪製純文字,然後再建立一個CTRun來繪製加粗文字等等。要注意,你不需要自己建立CTRun,Core Text將根據NSAttributedString的屬性來自動建立CTRun。每個CTRun對象對應不同的屬性,正因此,你可以自由的控制字型、顏色、字間距等等資訊。
看一下iOS平台下CoreText的一些常用的類。
NSAttributedString CFAttributedString 一段有自己樣式(統一不可變)的文字
NSMutableAttributedString CFMutableAttributedString 一段有多種樣式的文字
CTFrame
1.CGPath -> CGPathGetBoundingBox 得到佔用的地區大小
2.CTFrameGetLineOrigins 可以得到每行的起始位置
3.還可以控制文字橫排豎排等
CTFramesetter
1.CTFramesetterSuggestFrameSizeWithConstraints 確定文字所需區域大小或指定地區可以顯示多少文字
CTLine
1.CTLineGetStringIndexForPosition 確定地區內點處文字範圍
NSTextCheckingResult 代表各種連結,時間地址電話網址自訂等。
NSDataDector
這是一個專門配合NSTextCheckingResult檢測是否是特定連結的類。繼承於NSRegularExpression類。
enumerate 遍曆
match 匹配的數組
numbersOfMatch 匹配的個數
1.使用core text就是先有一個要顯示的string,然後定義這個string每個部分的樣式->attributedString -> 產生 CTFramesetter -> 得到CTFrame -> 繪製
其中可以更詳細的設定換行方式,對齊,繪製地區的大小等。
2.繪製只是顯示,點擊事件呢?就需要一個判斷了。
CTFrame 包含了多個CTLine,並且可以得到各個line的其實位置與大小。判斷點擊處在不在某個line上。CTLine 又可以判斷這個點(相對於ctline的座標)處的文字範圍。然後遍曆這個string的所有NSTextCheckingResult,根據result的rang判斷點擊處在不在這個rang上,從而得到點擊的連結與位置。處理。
轉自:pjk1129