Core Text概述
本文是我翻译的苹果官方文档《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 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语言方法,比如CTFramesetterCreateWithAttributedString 和CTFramesetterCreateFrame 而不是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布局引擎的结构

为了生成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),使用包含属性的字典来描述一个字体。

4.字体集合
字体集是字体描述组合在一起成为一个对象。一个字体集代表CTFontCollection不透明类型。字体集合提供字体封装的能力,访问全局和自定义里字体集的能力,也有访问字体集里字体描述的能力。我们可以使用CTFontCollectionCreateFromAvailableFonts创建所有系统字体的集合,然后使用这个字体集获取字体描述的所有成员。
Core Text概述的更多相关文章
- ios开发:Core Data概述
Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Cor ...
- ASP.NET Core MVC 概述
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...
- 《驾驭Core Data》 第一章 Core Data概述
<驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...
- Core Text
Core Text 本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Cor ...
- CoreText学习(一)Base Objects of Core Text
最近要做一个读入Word,PDF格式等的文件并且加以编辑的程序,本来以为使用Text Kit结合Text View来打开doc文件是完全没问题的,结果用了各种方法打开要么是数据是nil,要么打开的文字 ...
- [翻译] Core Text Objective-C Wrapper
Core Text Objective-C Wrapper https://github.com/akosma/CoreTextWrapper Introduction(介绍) One of the ...
- IOS利用Core Text对文字进行排版 - 转
原贴地址:http://hi.baidu.com/jwq359699768/blog/item/5df305c893413d0a7e3e6f7b.html core text 这个包默认是没有的,要自 ...
- 基于Core Text实现的TXT电子书阅读器
本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...
- Core Text 入门
本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...
随机推荐
- hiho1091_clicker背包问题
问题 类似有限背包问题,题目链接:clicker 实现 #include<stdio.h> #include<cmath> #include<iostream> # ...
- Alpha
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...
- 联想手机#P1来了#P1背后的故事系列
http://bbs.lenovo.com/forum.php?mod=viewthread&fid=928&tid=560992&extra=page%3D1 联想手机#P1 ...
- Java 创建xml文件和操作xml数据
java中的代码 import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; ...
- Unity3D中目标相对自身的前后左右方位判断
http://blog.csdn.net/cen616899547/article/details/38336185 在做rpg类游戏的过程中,经常遇到要判断周围怪物相对自身的方位 1.判断目标在 ...
- 常用SQL语句(交互)
%-------通配符 select * from [EMoney_Club].[dbo].[GoldIdea_AdviceCollect] where [Content] like '%昵称%' s ...
- 能源项目xml文件标签释义--<context:component-scan>
<context:component-scan base-package="com.xindatai.ibs" use-default-filters="false ...
- DI 之 3.3 更多DI的知识(陆)
3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 " ...
- DOM事件流
DOM事件标准定义了两种事件流:Capture(捕获)和Bubbing(冒泡):捕获和冒泡是javascript针对dom事件处理的先后顺序,所谓的先后顺序是指针对父标签与其嵌套子标签,如果父标签与嵌 ...
- hduoj-----(1068)Girls and Boys(二分匹配)
Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...