iOS 开发中经常会遇到一些文字排版或者图文混排的需求,在 iOS7 以前一般都使用 CoreText 来处理这样的需求,iOS7 之后可以使用系统的 TextKit ,TextKit 是对 CoreText 的封装。
CoreText 是用于处理文字和字体的底层技术,它直接和 Core Graphics 交互;它真正负责绘制的是文本部分,如果要绘制图片,可以使用 CoreText给图片预留出位置,然后用 Core Graphics 绘制。
底层结构图
字形度量
- bounding box(边界框),是一个假想的框子,它尽可能紧密的装入字形。
- baseline(基线),一条假想的线,一行上的字形都以此线作为上下位置的参考,在这条线的左侧存在一个点叫做基线的原点。
- ascent(上行高度),从原点到字体中最高(这里的高深都是以基线为参照线的)的字形的顶部的距离,ascent 是一个正值。
- descent(下行高度),从原点到字体中最深的字形底部的距离,descent 是一个负值(比如一个字体原点到最深的字形的底部的距离为4,那么 descent 就为-4)。
- linegap(行距),linegap 也可以称作 leading(其实准确点讲应该叫做External leading)。
- leading,其实是上一行字符的 descent 到下一行的 ascent 之间的距离。
- 因此字体的高度是由三部分组成的:leading + ascent + descent。
字形和字符 可以参考本文的详解,苹果官方文档:Querying Font Metrics、Text Layout。