CoreText 是 iOS/OS X 低級文本佈局引擎,提供精確控制字形、排版、圖片內嵌、鏈接交互等能力,適用於高性能富文本渲染 (如電子書、雜誌 App)。
NSAttributedString,輸出 CTFrame。內部持有 CTTypesetter (字形生成) 與字體信息。CTLine。CTRun。流程:NSAttributedString → CTFramesetter → CTFrame (在路徑中) → CTLine 數組 → CTRun 數組 → 字形。
CoreText 不直接繪圖,但可通過 CTRunDelegate 為特定 CTRun 預留空間 (ascent, descent, width)。繪製時計算圖片原點:
origin = contentOffset + frameOrigin + lineOrigin + runOrigin。
在 drawRect: 中用 CGContextDrawImage 繪製。
| 維度 | CoreText | WebView |
|---|---|---|
| 記憶體 | 低 | 高 |
| 佈局高度預測 | 即時 (CTFrame 即可得高) | 需渲染後 JS 獲取 |
| 執行線程 | 可後台佈局 | 僅主線程 |
| 原生交互 | 細膩 (按鈕、手勢) | JS 橋接有延遲 |
| 複製文本 | 需自行實現 | 原生支援 |
| 圖片/鏈接排版 | 需自行處理 | HTML/CSS 自動 |
// 創建 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);
Core Text Programming GuideCTView (GitHub)、CoreTextWrapper