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的测试项 ...
随机推荐
- JSON和JSONP区别和联系
由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...
- 微信jssdk
http://203.195.235.76/jssdk/?from=timeline&isappinstalled=0
- 如何用腾讯云打造一款微视频APP
版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...
- JQUERY学习(贰)
一.操作一组jQuery对象 1.遍历 $("").each(fun); 2.求长度:length size() 3.获得某一个jQuery对象 $("") ...
- C#高级知识点概要(2) - 线程和并发
原文地址:http://www.cnblogs.com/Leo_wl/p/4192935.html 我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验 ...
- selenium+python笔记11
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc: search in mail box "&qu ...
- robotframework笔记18
测试执行 如何创建测试套件结构解析 执行测试数据,如何继续执行一个测试用例失败后, 以及如何优雅地停止整个测试执行. 执行流 执行测试套件和 总是在一个测试套件执行测试用例. 一个测试套件 创建从一个 ...
- SQL SERVER数据库索引、外键查找
1.索引查找 select a.name as tabname ,h.name as idname,h.type_descfrom sys.objects as a right join sys.in ...
- KVC与KVO的进阶使用
本篇主要介绍键-值编码KVC,键值观察KVO的进阶使用的一些技巧主要是一下两个方面: KVC的集合操作符 KVO的手动实现方式 KVC集合操作符 关于集合操作符在苹果官方文档搜索Collection ...
- this和super关键字
this关键字: 1.引用成员变量 2.通过this(参数列表)调用类的重载的构造方法 3.返回对象的值:使用return this,来返回某个类的引用. super关键字: 1.super是一个引用 ...