Core Text概述

时间:2023-06-12 17:24:17

  本文是我翻译的苹果官方文档《Core Text Overview

  Core Text框架是高级的底层文字布局和处理字体的技术。它在Mac OS X v10.5 and iOS 3.2开始被引入,因此可以在iOS和OS X上使用Core Text。

  重要提示:Core Text是被设计来帮助解决开发者需要底层处理文字布局和字体的技术,比如提供开发者布局引擎。如果可能的话,开发者应尽量在iOS中使用Text Kit (Text Kit使用教程)或者在OS X中使用Cocoa text System技术。Core Text是他们的底层技术,因此他们都具备效率和速度的特点。而且Text Kit 和 Cocoa text system都具备富文本编辑,页面布局引擎的所有功能,并且相比单独使用Core Text,它们还提供了其他的基础功能。

Core Text概述

总览

  Core Text框架相比Core Graphics(Quartz)框架是更为底层的文字处理技术。如果你直接使用Quartz,你需要描写(draw)一些文字。如果使用Core Text,它提供一套页面布局引擎——当你知道文字的内容,并且知道文字应该怎么显示,那你可以使用Core Text 的排版技术(比如:文字间距、文字分隔符,连字符,文字调整)来设置字体形状和位置。

Core Text布局文字

  Core Text生成字体形状(如字符编码,字体数据)并同时布局他们的位置。它将字体排版成行和段落。Core Text同时能获取文字形状有关的数据(如字体位置,行,段落等)。它也处理字符属性和段落样式,包括各种标签样式和位置。

使用Core Text管理字体

  Core Text API 提供了多种字体,而且使用起来很方便。它提供很多主要用的字体,包括字体变换,字体链接。Core Text也可以替代Quartz用来加载自己的字体。

Core Text是基于C语言并且跨平台的API

  Core Text在iOS和OS X上使用几乎相同,只是OS X上的字体管理API更加丰富,包括可变的字体集合。但是当你打算在不同平台间迁移代码,必须考虑到UIKit和AppKit的不同,比如我们必须使用Quartz 段落会话(graphic contex)渲染Core Text的文字,而不同平台的段落会话(graphic contex)是不同的。在iOS中视图使用UIView,在OS X 上是NSView。在iOS中drawRect传入的是CGRect对象,在OS X 上传入的是NSRect对象(可以使用NSRectToCGRect方法进行转换)。

Core Text对象是C语言的不透明类型(opaque type)

  iOS和OS X的多数类库因为考虑速度和易用性使用了C语言编写。当使用Core Text时,我们使用一系列的C语言方法,比如CTFramesetterCreateWithAttributedStringCTFramesetterCreateFrame 而不是OC 的方法和类型。

1.Core Text中不透明类型(opaque type)

  Core Text布局引擎通常和属性字符串(CFAttributedStringRef)和图形路径(CGPathRef)。属性字符串为字符串封装了定义文字样式的文字属性(比如,字体和颜色)。Core Text使用这些属性字符串的信息将字符转换成形象文字。图形路径定义了文本的frame的形状。在OS X 10.7之后和iOS 3.2之后,路径不能为方形。CFAttributedStringRef是CFAttributedString引用类型,无缝对接Foundation框架的NSAttributedString类。因此NSAttributedString *参数的方法中,你可以传入CFAttributedStringRef类型,反之也是如此(为了解决编译器警告,可能你需要进行类型转换)。

  属性值是描述字符串中的字符样式的键值对。属性赋值给属性字符串,可以使用CFDictionary对象获取属性。为了给文字添加样式,需要创建包含属性值的CFDictionary对象,然后使用它作为参数初始化一个属性字符串,或者将它赋值给CFMutableAttributedString对象。尽管CFDictionaryRef 和 NSDictionary无缝对接,但是它里面的属性可能不能互相转换,所以使用CFMutableAttributedString而不是CFAttributedString。

  Core Text对象在运行时形成如图表1-1的结构。在结构的顶层是CTFramesetter对象(CTFramesetterRef)。输入属性字符串和图形路径,然后CTFramesetter对象会创建一个或者多个文本的frame(CTFrameRef)。每个CTFrame代表一个段落。

图表1-1Core Text布局引擎的结构

Core Text概述

  为了生成frames,framesetter调用typesetter(CTTypesetterRef),typesetter铺排文本的同时,framesetter给它添加段落样式。包括属性(对齐方式,段落空格,行距,凹口,分隔符等)。typesetter将属性字符串中的文字转换成形象文字,并将他们填充文本frame的行中。

  每个CTFrame对象包含一个段落行CTLine对象。每个行line对象代表一行文本。一个CTFrame可能只包含一个长的CTLine对象也可能包含多行。

每行CTLine包含一组形状文字对象。一个形象文字是一系列拥有相同属性和方向的象形字的集合。typesetter在创建行的同时通过字符串,属性,字体对象创建象形字。这意味着一行包含多个象形字,象形字能将他们添加到段落会话(graphic context)。

2.字体对象

  字体用来帮助在排版文字和创建图形会话时创建当前字体。Core Text不透明类型CTFont是一个封装很多信息的字体对象实例。它的引用类型CTFontRef,和iOS的UIFont和OS X的NSFont无缝对接。当你创建一个CTFont对象时,你设置点的大小和变化模型,来描述字体对象具体的特征。你可以查询字体对象的关于字体的多种信息,尤其是点大小,也字符到形象字的mapping,编码和 测量数据,形状数据以及其他信息。字体测量值包括ascent, descent, leading, cap height, x-height等。形状数据包括边框举行和形象字。

  字体对象是不能修改的,因此可以被多个操作线程同时使用。创建字体的方式多种,常用的方式是通过CTFontCreateWithFontDescriptor创建对象字体描述的方式。根据你的需要,你可以使用多个转换的API,比如,你可以使用Core Graphics字体引用(CTFontCreateWithGraphicsFont),也可以使用CTFontCreateUIFontForLanguage创建应用程序的用户接口字体。

   Core Text 字体引用提供复杂的,自动的字体替代技术,它叫做字体瀑布流。

3.字体描述(Font Descriptors)

  字体描述(CTFontDescriptor),使用包含属性的字典来描述一个字体。

Core Text概述

4.字体集合

  字体集是字体描述组合在一起成为一个对象。一个字体集代表CTFontCollection不透明类型。字体集合提供字体封装的能力,访问全局和自定义里字体集的能力,也有访问字体集里字体描述的能力。我们可以使用CTFontCollectionCreateFromAvailableFonts创建所有系统字体的集合,然后使用这个字体集获取字体描述的所有成员。