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:方法中实现。