本文是我翻译的苹果官方文档《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语言方法,比如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布局引擎的结构

  为了生成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概述的更多相关文章

  1. ios开发:Core Data概述

    Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Cor ...

  2. ASP.NET Core MVC 概述

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...

  3. 《驾驭Core Data》 第一章 Core Data概述

    <驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...

  4. Core Text

    Core Text 本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Cor ...

  5. CoreText学习(一)Base Objects of Core Text

    最近要做一个读入Word,PDF格式等的文件并且加以编辑的程序,本来以为使用Text Kit结合Text View来打开doc文件是完全没问题的,结果用了各种方法打开要么是数据是nil,要么打开的文字 ...

  6. [翻译] Core Text Objective-C Wrapper

    Core Text Objective-C Wrapper https://github.com/akosma/CoreTextWrapper Introduction(介绍) One of the ...

  7. IOS利用Core Text对文字进行排版 - 转

    原贴地址:http://hi.baidu.com/jwq359699768/blog/item/5df305c893413d0a7e3e6f7b.html core text 这个包默认是没有的,要自 ...

  8. 基于Core Text实现的TXT电子书阅读器

    本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...

  9. Core Text 入门

    本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...

随机推荐

  1. C++ Primer 笔记(2)第二章 变量与基本类型

    第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...

  2. android 开发 常用工具类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅 ...

  3. js的预编译机制

    1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错) 2.js的预编辑:[对定义式函数]直接创建为作用域上的函数变 ...

  4. android内存泄露小谈

    在做android的时候,用的语言大部分情况下都是java.以前最开始做的是编译器开发, 大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC.对比之下, 感觉还是java用起 ...

  5. bzoj题解汇总(1001-1016)

    bzoj1001: 平面图网络流. 注意只有一行或者一列的情况. bzoj1002: 待定系数法求解递归式.或者用MatrixTree+行列式直接推导. 然后来个高精度. bzoj1003: dp+最 ...

  6. (转)Android APK反编译详解

    转载地址:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到 ...

  7. 在AngularJS应用中实现认证授权

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAokAAAFwCAIAAABbwHY6AAAgAElEQVR4nOy9+XtcxbX3+/4H9z73jP ...

  8. WANL标准组织介绍-02

    无线电管理委员会 FCC ETSI IEEE Wi-Fi IETF WAPI 国家无线电管理委员会认证 国家无线电管理委员会认证(State Radio Regulatory Commission o ...

  9. exit(0)和exit(1)区别

    exit(0):正常退出程序: exit(1):非正常退出程序: return:返回. return是语言级别的,表示调用堆栈的返回: exit是系统调用级别的,表示一个进程的退出.

  10. 查看Linux软件信息

    查看系统发型版本 1. 对于linux系统而已,有成百上千个发行版.对于发行版的版本号查看方法 如以centos为例.输入lsb_release -a即可 该命令适用于所有的linux,包括Redha ...