CoreText初步(是什么,可以用来干什么)
一·CoreText是什么
苹果的文档中对CoreText的描述如下
Core Text is an advanced, low-level technology for laying out text and handling fonts. Core Text works directly with Core Graphics (CG), also known as Quartz, which is the high-speed graphics rendering engine that handles two-dimensional imaging at the lowest level in OS X and iOS.
翻译过来的意思就是:CoreText是一种高级的底层技术, 用于布局文本和处理字体。CoreText直接与Core Graphics (CG) 一起工作, 也称为Quartz, 它是在 OS X 和 iOS 的最底层的处理二维成像的高速图形渲染引擎。
CoreText是Mac OS和iOS系统中处理文本的low-level API, 不管是使用OC还是swift, 实际我们使用CoreText都还是间接或直接使用C语言在写代码。CoreText是iOS和Mac OS中文本处理的根基, TextKit和WebKit都是构建于其上。
注意:这个是 iOS7 之后的架构图,在 iOS7 以前,并没有图中的 Text Kit 类,不过 CoreText 仍然是处在最底层直接和 Core Graphics 打交道的模块。
2903435-c9739ac0350fc7ba.png
二.CoreText可以做什么
1.当前项目中的应用
-协议弹窗
345.png
-特殊文字显示
123.png
2.图文混排
456.png三.CoreText的元素内容有哪些
1.架构流程图和CoreText框架基础
CoreText在文本布局和处理字体过程是很高效的,因为CoreText能直接使用CoreGraphics。而CoreGraphics是OSX和iOS平台非常高效的二维成像渲染引擎。CoreText在上层框架与底层框架之间起到了桥梁的作用,把上层框架提供的文本布局信息(例如:字体、颜色、行间距)等信息转化为CoreGraphics能直接使用的数据类型(例如CTFrame、CTLIne、CTRun、CTFout)。CoreText提供的数据类型CoreGraphics能直接使用,所以使用CoreText渲染文本是效率非常高的。
CoreText架构图.png
常用类、属性
CTFrameRef
CTFramesetterRef
CTLineRef
CTRunRef
CTTypesetterRef
CTGlyphInfoRef (NSGlyphInfo)
CTParagraphStyleRef (NSParagraphStyle)
CTFontRef (UIFont)
CFArrayRef (NSArray)
2.CoreText元素
字体结构
字体结构.png CoreText元素图.png
- CTFrame可以想象成画布, 画布的大小范围由CGPath决定
- CTFrame由很多CTLine组成, CTLine表示为一行,CTLine 可以看做Core Text绘制中的一行的对象 通过它可以获得当前行的line ascent,line descent ,line leading,还可以获得Line下的所有Glyph Runs
- CTLine由多个CTRun组成, CTRun相当于一行中的多个块, 但是CTRun不需要你自己创建, 由NSAttributedString的属性决定, 系统自动生成。每个CTRun对应不同属性。
- CTRun 或者叫做 Glyph Run,是一组共享想相同attributes(属性)的字形的集合体
一个CTFrame有几个CTLine组成,有几行文字就有几行CTLine。一个CTLine有包含多个CTRun,一个CTRun是所有属性都相同的那部分富文本的绘制单元。所以CTRun是CTFrame的基本绘制单元。 - CTFramesetter是一个工厂, 创建CTFrame, 一个界面上可以有多个CTFrame
-
CTFrame就是一个基本画布,然后一行一行绘制。 CoreText会自动根据传入的NSAttributedString属性创建CTRun,包括字体样式,颜色,间距等
注意:你不需要自己创建CTRun,Core Text将根据NSAttributedString的属性来自动创建CTRun。每个CTRun对象对应不同的属性,正因此,你可以自由的控制字体、颜色、字间距等等信息。
通常处理步聚:
CoreText流程图.png
1、创建AttributedString,定义样式
2、通过 CFAttributedStringRef 生成 CTFramesetter
3、通过CTFramesetter得到CTFrame
4、绘制 (CTFrameDraw)
5、如果有图片存在,先在AttributedString 对应位置添加占位符
6、通过回调函数确定图片的宽高(CTRunDelegateCallbacks)
7、遍历到对应CTRun上、获取对应CGRect、绘制图片(CGContextDrawImage)
1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。
四.如何使用CoreText
CoreText是需要自己处理绘制,不像UILabel等最上层的控件 ,所以我们必须在drawRect中绘制,为了更好地使用,我们需要自定义一个UIView。
转换坐标系
UIKit的坐标系原点是在右上角,CoreText的坐标原点是在左下角,并且绘制的内容是颠倒的,所以需要进行坐标转换,绘制的内容显示才能正常
781681-20160107095453075-2053394561.png.jpg