CoreText概述
CoreText在文本布局和处理字体过程是很高效的,因为CoreText能直接使用CoreGraphics。而CoreGraphics是OSX和iOS平台非常高效的二维成像渲染引擎。CoreText在上层框架与底层框架之间起到了桥梁的作用,把上层框架提供的文本布局信息(例如:字体、颜色、行间距)等信息转化为CoreGraphics能直接使用的数据类型(例如CTFrame、CTLIne、CTRun、CTFout)。CoreText提供的数据类型CoreGraphics能直接使用,所以使用CoreText渲染文本是效率非常高的。
CoreText架构
CoreText层架构如图所示

在CoreText架构中,最顶层是CTFramesetter对象,可以通过一个属性字符串(CFAttributedStringRef)对象初始化。CTFramesetter可以生成CTFrame对象,生成CTFrame对象时,CTFramesetter将段落样式应用于CTFrame上,包括对齐、制表符、行间距、缩进和换行模式等属性。这个过程会把属性字符串的字符转换为字形(glyph),并把每个字形按尽可能合适的位置一行一行的排列好。
每个CTFrame对象包含一个或多个CTLine对象,每个CTLine对象代表一行文字。
而每个CTLine对象包含一组CTRun对象,一个CTRun是一段连续的具有相同属性和方向的字形。
CTFrame、CTLine、CTRun都可以直接绘制到图形上下文上的。
字符(Characters)和字形(Glyphs)
字符和字形的关系
字符
是一种语言中带有特定的含义的最小书写单元。在语言的口语中,字符
可以与特定的声音相对应,就像罗马字母的字母一样;它们可以代表完整的单词,如中文的表意文字;或者它们可以表示独立的概念,比如数学符号。然而,在任何情况下,字符
都是一个抽象的概念。
虽然字符
必须以可识别的形状在区域中显示,但显示的形状并可以不同。也就是说,一个字符可以以不同的形式绘制,并且保持相同的字符。例如,一个大写A
字符可以用不同的大小或不同的笔划厚度来绘制,它可以倾斜或垂直的,并且它还有某种形式的可选变体。任何一种不同的具体形式的字符都称为字形。图2 显示了不同的符号,它们都表示字符大写a
。

字符
和字形
之间并没有一一对应的关系。在一些情况下,一个字符
可能对应多个字形
,比如字符é
对应的字形由字形e
和字形´
组成。还有些情况一个字形
可能对应多个字符
,比如连写的情况,如 图3 所示

字形度量(Glyph Metrics)
下面就来详细看看字形的各个参数,先看一张图

-
边界框(bounding rectangle)
这是一个假想的框子,它尽可能紧密的装入字形。 -
基线(baseline)
一条假想的线,一行上所有的字形都以此线作为上下位置的参考,在这条线的左侧存在一个点叫做基线的原点, -
基础原点(Origin)
基线上最左侧的点。 -
上行高度(ascent)
从字形的顶部到基线的距离 -
下行高度(descent)
从字形的底部到基线的距离 -
行间距(line gap)
line gap也可以称作leading(其实准确点讲应该叫做External leading), -
行高(line height)
行高line height
则可以通过ascent + descent + linegap
来计算。 -
字间距(Kerning)
字与字之间的距离,为了排版的美观,并不是所有的字形之间的距离都是一致的,但是这个基本不影响到我们的文字排版。
下面来看一个例子,如图

红框高度既为当前行的行高,绿线为baseline
,绿色到红框上部分为当前行的最大ascent
,绿线到黄线为当前行的最大desent
,而黄框的高即为行间距。由此可以得出:lineHeight = ascent + decent + leading
。
总结
这篇文章简单介绍了CoreText在文本布局过程中的作用以及字形的属性,了解了这些基础知识才能更好的使用CoreText,后续的文章会使用CoreText绘制文本,看CoreText是如何控制文本的样式的。
参考文档
CoreText(一):基本用法
Core Text Programming Guide
Text Programming Guide for iOS
网友评论