暂时没看却需要看的iOS开发技术分享iOS高阶UI相关

Core Text 学习笔记-基础

2017-07-17  本文已影响280人  樂亦leeyii

前言

最近在学习YYKit框架,看到关于CoreText相关的知识的时候感到非常吃力,于是乎就恶补了一下Core Text相关的基础知识。

Glyphs(字形)

Core Text简介

CoreText 是用于处理文字和字体的底层技术。它直接和 Core Graphics(又被称为 Quartz)打交道。Quartz 是一个 2D 图形渲染引擎,能够处理 OSX 和 iOS 中的图形显示。

注意:这个是 iOS7 之后的架构图,在 iOS7 以前,并没有图中的 Text Kit 类,不过 CoreText 仍然是处在最底层直接和 Core Graphics 打交道的模块。


图上可以看出CoreText处于非常底层的位置上层的UILabel,UITextfield等都是通过CoreText来实现的。
Quartz 这个框架能够直接通过字形(glyphs)和位置(positions)将文字渲染在视图上面。

UIWebView 也是处理复杂的文字排版的备选方案。对于排版,基于 CoreText 和基于 UIWebView 相比,前者有以下好处:

当然,基于 CoreText 的排版方案也有一些劣势:

Core Text关键类

NSAttributedString

富文本,使用NSAttributedString(CFAttributedStringRef)可以创建CTFramesetter。
- (instancetype)initWithString:(NSString *)str attributes:(nullable NSDictionary<NSString *, id> *)attrs
第二个参数attributes:包含了详细的文字排版信息。详细的信息可以在<CoreText/CTStringAttributes.h>或者#<Foundation/NSAttributedString.h>文件中看到。

CTFramesetter

通过CFAttributedString(NSAttributedString)创建,作用相当于一个生产CTFrame的工厂。

CTFrame

每个CTFrame可以看做一个段落 每个CTFrame由多个CTLine组成。可以使用它进行绘制

CTLine

代表一个line 一行文字中可能有多个CTLine组成,单每一个CTLine一定在同一行内。 一个CTLine有多个CTRun组成。也可以使用它进行绘制。

CTRun

一个连续的有着相同的attributes和direction的字形(glyph)的集合,是最小的字形绘制单元。

CTTypesetter

通过CFAttributedString(NSAttributedString)创建,相当于一个生产CTLine的工厂。

e

代码

自定义一个view继承UIView,重写drawRect: 方法
使用Core Text简单的绘制一个段落

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 1.获取绘制上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 2.翻转坐标系
    //    对于底层绘制引擎来说左下角是(0,0),对于上层UIKit来说左上是(0,0)点
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    
    // 3.创建矩形的路径 指定文字的绘制范围
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, self.bounds);
    
    // 4.创建富文本
    NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"Hello, World! I know nothing in the world that has as much power as a word. Sometimes I write one, and I look at it, until it begins to shine." attributes:nil];
    
    // 5.根据attrStr初始化CTFramesetterRef
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrStr);
    
    // 6.使用framesetter根据刚才创建的绘制路径和字符串范围初始化CTFrameRef
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
    // 7.在指定的上下文中绘制指定的内容
    CTFrameDraw(frame, context);
    
    // 8. 释放内存
    CFRelease(frame);
    CFRelease(framesetter);
    CFRelease(path);

}

Reference:

Core Text Programming Guide
iOS文字排版(CoreText)那些事
基于 CoreText 的排版引擎:基础
CoreText入门

上一篇 下一篇

猜你喜欢

热点阅读