美文网首页CoreText
CoreText初步(是什么,可以用来干什么)

CoreText初步(是什么,可以用来干什么)

作者: LiuffSunny | 来源:发表于2019-08-06 18:13 被阅读0次

一·CoreText是什么

苹果的文档中对CoreText的描述如下

官网文档:https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html

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

相关文章

  • CoreText初步(是什么,可以用来干什么)

    一·CoreText是什么 苹果的文档中对CoreText的描述如下 官网文档:https://developer...

  • CoreText编程指南(OverView)

    CoreText是用来文字排版和处理字体的一个高级的底层技术。CoreText直接和CoreGraphics(CG...

  • CoreText编程指南(简介)

    关于Core Text CoreText是用来文字排版和处理字体的一个高级的底层技术。CoreText API,在...

  • ”手可以用来干什么?”

    刚才接奔子放学,他兴高采烈地告诉我,老师今天奖励了他4个小红苹果。我问他为什么,其中一个的缘故让我不禁莞尔! 语文...

  • mockito可以用来干什么?

    mockito是mock里比较常用的,可以模拟一个类, 解决依赖过多问题. 1. 团队可以并行工作 有了Mock,...

  • runtime 可以做什么

    这篇文字不扯淡,不讲runtime是什么,只总结下runtime 可以用来干什么。这几篇文章写的很好,Object...

  • CoreText

    目录 1.CoreText框架概述 一、CoreText框架概述 1.CoreText框架图 2.Coretext...

  • 领导除了用来害怕,还可以用来干什么?

    工作中遇到一个现象,觉得很有意思:我们都害怕自己的领导。 有一个同事,说领导曾经在下班之后给她发了一个图片,她半个...

  • Handler

    Handler初步 Handler是什么? Handler是Android给我们提供用来更新UI的一套机制,也是一...

  • 关于一种多功能蒸汽熨烫刷的使用方法

    可能对于多功能蒸汽熨烫刷,有很多人都不知道是什么,是用来干什么的,其实就是内部配备毛刷,可以用来清洁衣物上的毛球,...

网友评论

    本文标题:CoreText初步(是什么,可以用来干什么)

    本文链接:https://www.haomeiwen.com/subject/ywgwdctx.html