CoreText 简单了解

2020-08-23  本文已影响0人  苏沫离

1、 排版的一些基础知识

1.1、字符(Character)和字形(Glyphs)

1.1.1、概念

文本显示的主要过程就是字符到字形的转换:

连字符

连字符是一种上下文相关的字形,一个字符的字形由受到下一个字符的影响。

1.1.2、字形度量

在 iOS 中渲染到屏幕的字形有多个度量(Glyph Metrics):

字形度量

2、 CoreText

Core Graphics 是一个2D图形渲染引擎,能够处理iOS中图形显示问题:能够直接处理字体(Fonts)和字形(glyphs),将文字渲染到界面上,它是基础库中唯一能够处理字形的模块。
CoreText 是在 Core Graphics 基础上对处理文字和字体的功能的封装,将显示的文字内容、位置、字体、字形直接传递给 Core Graphics。与其他 UI 组件相比,CoreText 具有更高效的排版功能!

基础库架构图.png

CoreText 处在非常底层的位置,我们常用的 UILableUITextFieldUITextViewUIWebView 都是基于 CoreText 来实现的。

使用 CoreText 的优点:

2.1、CoreText 坐标系问题

CoreTextCore Graphics 基础,使用 Core Graphics 的坐标系,以左下角为坐标原点;而我们常使用的UIKit是以左上角为坐标原点! 因此使用 CoreText 绘制文字需要对其坐标系进行转换,否则直接绘制出现位置反转的镜像情况。

坐标系.jpg

通常情况下是直接获取当前上下文 CGContext,将 CGContext 的坐标系转换为CoreText坐标系,再将布局好的CoreText绘制到当前上下文中:

- (void)drawRect:(CGRect)rect{
     //1.获取当前绘图上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //2.旋转坐坐标系(默认和UIKit坐标是相反的)
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);//设置当前文本矩阵
    CGContextTranslateCTM(context, 0, CGRectGetHeight(rect));//文本沿y轴移动
    CGContextScaleCTM(context, 1.0, -1.0);//文本翻转成为CoreText坐标系
        
    //3.开始绘制
    CTFrameDraw(_frameRef, context);
}

3、 CoreText 的常用布局元素

渲染文字到屏幕时常用的几个元素如下:

`CTFrame`组成.png

除了上述几个元素,还有一些类默默的处理排版:


第一篇 CoreText的简单了解
第二篇 CoreText 排版与布局
第三篇 CTLineRef 的函数库及使用
第四篇 图文混排的关键 CTRunRef 与 CTRunDelegate
Demo:小说阅读器的文字分页、图文混排

上一篇下一篇

猜你喜欢

热点阅读