从0到1实现小说阅读器(一、初识CoreText)

1. CoreText 介绍

CoreText是实现富文本一种底层技术。很多UI控件都是基于CoreText实现的UILabelUITextFieldUITextViewUIWebViewUIWebView也能实现富文本,而且除了排版还支持内容的复制。但是CoreTextUIWebView比,占用内存更少、渲染速度更快、而且CoreTextCTFrameRef可以后台渲染,也就是说CoreTextUIWebView比更加灵活高效。缺点就是,实现起来相对复杂,内容的复制、图文混排、链接点击这些都要自己实现。

2. CoreText 的基本实现步骤:

1.创建绘制上下文(可以理解成画布)
  CGContextRef context = UIGraphicsGetCurrentContext();

2.将坐标系上下翻转(固定写法)
  CGContextSetTextMatrix(context, CGAffineTransformIdentity);
  CGContextTranslateCTM(context, 0, self.bounds.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);

说明:对于“底层绘制引擎”来说,左下角是(0,0)坐标。对于UIKit层来说,左上角是(0,0)坐标。为了适应UIKit层的显示,需要在这里做一个翻转操作。

3.创建绘制路径(可以理解成刷子)
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddRect(path, NULL, self.bounds);

4.创建文本
  NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Hello World!"

5.创建绘制内容
  CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);
  CTFrameRef frame = CTFramesetterCreateFrame(framesetter,   CFRangeMake(0, [attString length]), path, NULL);

6.开始绘制CTFrameRef
  CTFrameDraw(frame, context);

7.释放CoreText对象(非OC对象需要手动释放内存)
  CFRelease(frame);
  CFRelease(path);
  CFRelease(framesetter);

总结:
绘制的关键对象是CTFrameRef
绘制的关键方法是CTFrameDraw();
以上代码在UIView对象的drawRect:方法中实现

你可能感兴趣的:(从0到1实现小说阅读器(一、初识CoreText))