1. CoreText 介紹
CoreText是實(shí)現(xiàn)富文本一種底層技術(shù)。很多UI控件都是基于CoreText實(shí)現(xiàn)的UILabel、UITextField、UITextView、UIWebView。UIWebView也能實(shí)現(xiàn)富文本,而且除了排版還支持內(nèi)容的復(fù)制。但是CoreText和UIWebView比,占用內(nèi)存更少、渲染速度更快、而且CoreText的CTFrameRef可以后臺(tái)渲染,也就是說(shuō)CoreText和UIWebView比更加靈活高效。缺點(diǎn)就是,實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜,內(nèi)容的復(fù)制、圖文混排、鏈接點(diǎn)擊這些都要自己實(shí)現(xiàn)。
2. CoreText 的基本實(shí)現(xiàn)步驟:
1.創(chuàng)建繪制上下文(可以理解成畫布)
CGContextRef context = UIGraphicsGetCurrentContext();
2.將坐標(biāo)系上下翻轉(zhuǎn)(固定寫法)
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
說(shuō)明:對(duì)于“底層繪制引擎”來(lái)說(shuō),左下角是(0,0)坐標(biāo)。對(duì)于UIKit層來(lái)說(shuō),左上角是(0,0)坐標(biāo)。為了適應(yīng)UIKit層的顯示,需要在這里做一個(gè)翻轉(zhuǎn)操作。
3.創(chuàng)建繪制路徑(可以理解成刷子)
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, self.bounds);
4.創(chuàng)建文本
NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Hello World!"
5.創(chuàng)建繪制內(nèi)容
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [attString length]), path, NULL);
6.開始繪制CTFrameRef
CTFrameDraw(frame, context);
7.釋放CoreText對(duì)象(非OC對(duì)象需要手動(dòng)釋放內(nèi)存)
CFRelease(frame);
CFRelease(path);
CFRelease(framesetter);
總結(jié):
繪制的關(guān)鍵對(duì)象是CTFrameRef;
繪制的關(guān)鍵方法是CTFrameDraw();
以上代碼在UIView對(duì)象的drawRect:方法中實(shí)現(xiàn)。