CoreText概述

CoreText概述

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

CoreText架构

CoreText层架构如图所示

图1

在CoreText架构中,最顶层是CTFramesetter对象,可以通过一个属性字符串(CFAttributedStringRef)对象初始化。CTFramesetter可以生成CTFrame对象,生成CTFrame对象时,CTFramesetter将段落样式应用于CTFrame上,包括对齐、制表符、行间距、缩进和换行模式等属性。这个过程会把属性字符串的字符转换为字形(glyph),并把每个字形按尽可能合适的位置一行一行的排列好。

每个CTFrame对象包含一个或多个CTLine对象,每个CTLine对象代表一行文字。

而每个CTLine对象包含一组CTRun对象,一个CTRun是一段连续的具有相同属性和方向的字形。

CTFrame、CTLine、CTRun都可以直接绘制到图形上下文上的。

字符(Characters)和字形(Glyphs)

字符和字形的关系

字符是一种语言中带有特定的含义的最小书写单元。在语言的口语中,字符可以与特定的声音相对应,就像罗马字母的字母一样;它们可以代表完整的单词,如中文的表意文字;或者它们可以表示独立的概念,比如数学符号。然而,在任何情况下,字符都是一个抽象的概念。

虽然字符必须以可识别的形状在区域中显示,但显示的形状并可以不同。也就是说,一个字符可以以不同的形式绘制,并且保持相同的字符。例如,一个大写A字符可以用不同的大小或不同的笔划厚度来绘制,它可以倾斜或垂直的,并且它还有某种形式的可选变体。任何一种不同的具体形式的字符都称为字形。图2 显示了不同的符号,它们都表示字符大写a

图2

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

图3

字形度量(Glyph Metrics)

下面就来详细看看字形的各个参数,先看一张图

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

下面来看一个例子,如图

图5

红框高度既为当前行的行高,绿线为baseline,绿色到红框上部分为当前行的最大ascent,绿线到黄线为当前行的最大desent,而黄框的高即为行间距。由此可以得出:lineHeight = ascent + decent + leading

总结

这篇文章简单介绍了CoreText在文本布局过程中的作用以及字形的属性,了解了这些基础知识才能更好的使用CoreText,后续的文章会使用CoreText绘制文本,看CoreText是如何控制文本的样式的。


参考文档

CoreText(一):基本用法
Core Text Programming Guide
Text Programming Guide for iOS

你可能感兴趣的:(CoreText概述)