文字排版
在开始文本系统介绍之前,我们先了解一下文字是怎么排版的,而要了解文字的排版就必须现有一些基本概念。
我这里只做简单地介绍,具体请参考:Typographical Concepts。
字符(Characters)与字形(Glyphs)
上图表示的是连字(Ligatures),连字由字符 “f” 以及字符 “l” 组成,它们组合后成为一个字形(Glyph)。
与此类似的还有 “é”,它由 “e” 与 “´” 组合而成。
可以看到,字符与字形不一定是一一对应的关系,当然在一般情况下,它们可以看做是一一对应的。
字符编码
计算机通过编码表将字符存储为数字。在 Cocoa 平台的编码方案为 Unicode 标准。Unicode 标准为世界上每种现代书面语言中的每个字符提供了一个惟一的数字,其独立于所使用的平台、程序和编程语言。这个通用标准解决了一个长期存在的问题,即不同的计算机系统使用数百种相互冲突的编码方案。它还具有简化处理双向文本和上下文表单的功能。
字形结构
字体(Fonts)
上面介绍了字符与字形的关系,那么它们的关系具体又是什么呢?这就需要用到字体了。
字符加字体可以得到字形,在 Cocoa 中我们通过字体可以得到 CGGlyph,渲染的时候我们使用 CTFont 的方法传入 CGGlyph 就可以渲染出实际的文字。
文本系统架构
无论是 macOS 还是 iOS,苹果的文本系统的架构都是一样的,如上图所示。
在 Typesetter 以及 Glyph generator 之下是 CoreText,所以系统的整个文本系统是构建在 CoreText 之上。
在 iOS 平台,系统隐藏了 Typesetter、 Glyph generator。
整个系统遵循 MVC 的架构设计:
- Model:
NSTextStorage
、NSTextContainer
; - View:在 macOS 是
NSTextView
,在 iOS 是UITextView
; - Controller:
NSLayoutManager
。
NSTextStorage
保存富文本数据;NSTextContainer
提供布局区域;TextView
真实地展示文本;NSLayoutManager
来管理所有的布局以及缓存布局信息。