CoreText(一) 准备知识

字形(Character)和字符(Glyphs)

排版系统中文本显示的一个重要的过程就是字符到字形的转换,字符是信息本身的元素,而字形是字符的图形表征,字符还会有其它表征比如发音。 字符在计算机中其实就是一个编码,某个字符集中的编码,比如Unicode字符集,就囊括了大都数存在的字符。 而字形则是图形,一般都存储在字体文件中,字形也有它的编码,也就是它在字体中的索引。 一个字符可以对应多个字形(不同的字体,或者同种字体的不同样式:粗体斜体等);多个字符也可能对应一个字形,比如字符的连写( Ligatures)。

字形度量(Glyph Metrics)

字形度量是对应每一个字形的特定距离,以此描述如何对文本排版。

CoreText(一) 准备知识_第1张图片
CoreText(一) 准备知识_第2张图片

和CoreText相关的参量

  • Bounding box 这是一个假想的框子,它尽可能紧密的装入字形
  • ascent(上行高度) 从原点到字体中最高(这里的高深都是以基线为参照线的)的字形的顶部的距离,ascent是一个正值
  • descent下行高度)从原点到字体中最深的字形底部的距离,descent是一个负值
  • line gap(行距)linegap也可以称作leading(其实准确点讲应该叫做External leading)
  • Advancement 字形的经变换步长
  • lineHeight(行高) 则可以通过 ascent + |descent| + linegap 来计算。
坐标系

CoreText 使用的坐标系是传统的原点(0,0)在左下角的坐标系;UIKit 中使用的坐标系是原点(0,0)在左上角的坐标系

下面是一种转换方式:

CGContextTranslateCTM(context, 0, self.frame.size.height);
CGContextScaleCTM(context, 1, -1);

更多关于坐标系仿射变换的内容可以参考

Toll-Free Bridged Types

CoreText 中需要渲染的字符串类型是 CFMutableAttributedStringRef 是CoreFoundation中得类型,而我们常用的类型是NSMutableAttributedString是FoundationKit中的类型。关于这两种类型的转换Apple 提供了一中Toll-Free Bridged Types机制,即Core Foundation和Foundation中的有些数据类型只需要简单的强制类型转换就可以互换使用这样的类型被称为Toll-Free Bridged Types。

NSMutableAttributedString 和 CFMutableAttributedStringRef就是一对TFB 更多的Toll-Free Bridged Types可以参看DeveloperLibrary -Toll-Free Bridged Types

CoreText 对象模型
CoreText(一) 准备知识_第3张图片
  • CTFramesetter 通过CFAttributedString进行初始化,它作为CTFrame对象的生产工厂,负责根据path生产对应的CTFrame
  • CTFrame 是可以通过CTFrameDraw函数直接绘制到context上的,当然你可以在绘制之前,操作CTFrame中的CTLine,进行一些参数的微调
  • CTLine 可以看做Core Text绘制中的一行的对象 通过它可以获得当前行的line ascent,line descent ,line leading,还可以获得Line下的所有Glyph Runs
  • CTRun 或者叫做 Glyph Run,可以看做是一组共享想相同attributes(属性)的字形的集合体

参考


FreeType 管理字形

Core Text Tutorial for iOS: Making a Magazine App

DeveloperLibrary - Typographical Concepts

你可能感兴趣的:(CoreText(一) 准备知识)