首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

iOS CoreText 學習筆記:佈局引擎核心對象模型與繪製流程

     編輯:C++ 入門

iOS CoreText 學習筆記:佈局引擎核心對象模型與繪製流程

CoreText 是 iOS/OS X 低級文本佈局引擎,提供精確控制字形、排版、圖片內嵌、鏈接交互等能力,適用於高性能富文本渲染 (如電子書、雜誌 App)。

CoreText 對象模型

  1. CTFramesetter:輸入 NSAttributedString,輸出 CTFrame。內部持有 CTTypesetter (字形生成) 與字體信息。
  2. CTFrame:一個矩形區域內的排版結果,包含多行 CTLine。
  3. CTLine:單行文本,包含多個 CTRun。
  4. CTRun:同屬性 (字體、顏色、字距等) 連續字形序列。不直接創建,由引擎根據屬性自動分割。

流程:NSAttributedString → CTFramesetter → CTFrame (在路徑中) → CTLine 數組 → CTRun 數組 → 字形。

繪製圖片內嵌

CoreText 不直接繪圖,但可通過 CTRunDelegate 為特定 CTRun 預留空間 (ascent, descent, width)。繪製時計算圖片原點:
origin = contentOffset + frameOrigin + lineOrigin + runOrigin。
在 drawRect: 中用 CGContextDrawImage 繪製。

Character vs Glyph

  • Character:抽象字符 (如 'A'),承載語義。
  • Glyph:字符具體視覺表現 (字體、粗細、傾斜、連字)。
  • 非一對一:'é' 可能由 'e' + '´' 兩 glyph 組成;連字 'fi' 為單 glyph 代表兩字符。

CoreText vs UIWebView (WKWebView)

維度CoreTextWebView
記憶體低高
佈局高度預測即時 (CTFrame 即可得高)需渲染後 JS 獲取
執行線程可後台佈局僅主線程
原生交互細膩 (按鈕、手勢)JS 橋接有延遲
複製文本需自行實現原生支援
圖片/鏈接排版需自行處理HTML/CSS 自動

關鍵 API 速查


// 創建 Framesetter
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrStr);
// 獲取所需大小
CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(width, CGFLOAT_MAX), NULL);
// 創建 Frame
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,0), path, NULL);
// 獲取行數組
CFArrayRef lines = CTFrameGetLines(frame);
// 繪製
CTFrameDraw(frame, context);

參考資源

  • Apple 官方:Core Text Programming Guide
  • 開源實現:CTView (GitHub)、CoreTextWrapper
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved