1. CoreText 介绍
CoreText
是实现富文本一种底层技术。很多UI控件都是基于CoreText
实现的UILabel
、UITextField
、UITextView
、UIWebView
。UIWebView
也能实现富文本,而且除了排版还支持内容的复制。但是CoreText
和UIWebView
比,占用内存更少、渲染速度更快、而且CoreText
的CTFrameRef
可以后台渲染,也就是说CoreText
和UIWebView
比更加灵活高效。缺点就是,实现起来相对复杂,内容的复制、图文混排、链接点击这些都要自己实现。
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:
方法中实现。