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的测试项 ...
随机推荐
- phalcon: dispatcher调度控制器
phalcon: dispatcher调度控制器 我所理解的dispatcher调度控制器,实际上是对 router或者特定的url参数给与重组. 引用特定的类: //add use Phalcon\ ...
- tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
谷歌.百度该问题,发现,除非是真的忘记添加layout_height或者layout_width属性值,对于布局文件没有语法问题但又难以发现问题所在的情况,从自己的经历和一个帖子的说明看到,该错误多半 ...
- WMI执行远程文件(RPC)
通过wmi在远程机上执行命令(wmi:windows management interface 可以通过一个公共的接口访问不同操作系统(windows系统)的构成单元,利用它可以高效的管理远程和本地的 ...
- Poj 1273 Drainage Ditches(最大流 Edmonds-Karp )
题目链接:poj1273 Drainage Ditches 呜呜,今天自学网络流,看了EK算法,学的晕晕的,留个简单模板题来作纪念... #include<cstdio> #include ...
- CRM创建物料FM2
这是在佛山好帮手时受启发而研究出来的,创建物料,带单位,类型组 经测试....算了,不说了,有什么限制自己测去...今天心情不好... FUNCTION ZLY_CREATE_PRODUCT_UNIT ...
- 【转载】JSP中文乱码问题
原作者http://www.cnblogs.com/xing901022/p/4354529.html 阅读目录 之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因. ...
- BZOJ2721 [Violet 5]樱花
先令n! = a: 1 / x + 1 / y = 1 / a => x = y * a / (y - a) 再令 k = y - a: 于是x = a + a ^ 2 / k => ...
- PHP中的include、include_once、require、require_once
include.include_once().require.require_once() 作用: 通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件( ...
- Graphical installers are not supported by the vm
http://www-01.ibm.com/support/docview.wss?uid=swg21462180 Technote (troubleshooting) Problem(Abstrac ...
- C#拉姆达(=>)表达式
前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...