從0到1實(shí)現(xiàn)小說(shuō)閱讀器(一、初識(shí)CoreText)

1. CoreText 介紹

CoreText是實(shí)現(xiàn)富文本一種底層技術(shù)。很多UI控件都是基于CoreText實(shí)現(xiàn)的UILabel、UITextField、UITextView、UIWebView。UIWebView也能實(shí)現(xiàn)富文本,而且除了排版還支持內(nèi)容的復(fù)制。但是CoreTextUIWebView比,占用內(nèi)存更少、渲染速度更快、而且CoreTextCTFrameRef可以后臺(tái)渲染,也就是說(shuō)CoreTextUIWebView比更加靈活高效。缺點(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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容