iOS:图文混编之Core Text 初解

之前对于复杂的图文相关的需求,一般都是使用webview来做。但当加载webview较大时,就会很明显的感受到,页面的流畅度不够。且获取webview高度必须在加载完网页之后才能获取到。
而使用Core Text 则能避免这些问题,但使用CoreText也会带来一些其他问题,比如没有了手势识别,全部的手势识别都需要自己添加和处理,相关的属性的解析和渲染也需要自己来。
CoreText 简介


CoreText是一种能够对文本格式和文本布局进行精细控制的文本引擎。
它良好的结合了 UIKit 和 Core Graphics/Quartz的特性!你可以完全控制位置、布局、类似文本大小和颜色这样的属性,而 Core Text 将帮你完善其它的东西——类似文本换行、字体呈现等等。
当然,Core Text能渲染的只有文字,图片还是需要我们自己手动绘制,其实就是在图片要放置的位置上用一个特殊空白占位符号,并设置该符号的CTRunDelegate 附上其高度,宽度等属性。之后自己再将对应的图片渲染到图片需要渲染的位置上去。
1.Core Text知识准备

  • 坐标系:在iOS UIKit的UIView的坐标系原点在左上角。而Core Graphics的context使用的坐标系的原点是在左下角,因此我们在使用coreText时则需要将坐标进行一次翻转。使用如下代码即可实现翻转。
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);```
- 字符(Character)和字形(Glyphs):排版系统中文本显示的一个重要的过程就是字符到字形的转换,字符是信息本身的元素,而字形是字符的图形表征,字符还会有其它表征比如发音。 字符在计算机中其实就是一个编码,某个字符集中的编码,比如Unicode字符集,就囊括了大都数存在的字符。 而字形则是图形,一般都存储在字体文件中,字形也有它的编码,也就是它在字体中的索引。 一个字符可以对应多个字形(不同的字体,或者同种字体的不同样式:粗体斜体等);多个字符也可能对应一个字形,比如字符的连写( Ligatures)。

2.Core Text对象模型
下面我们将从core Text的其他细节来了解它:
![core Text的绘制流程](http://ww1.sinaimg.cn/large/65cc0af7gw1e2uxd1gmhwj.jpg)![CTFrame组成](http://ww4.sinaimg.cn/large/65cc0af7gw1e2uyn6r88oj.jpg)

- framesetter framesetter对应的类型是 CTFramesetter,通过CFAttributedString进行初始化,它作为CTFrame对象的生产工厂,负责根据path生产对应的CTFrame
- CTFrame CTFrame是可以通过CTFrameDraw函数直接绘制到context上的,当然你可以在绘制之前,操作CTFrame中的CTLine,进行一些参数的微调
- CTLine 可以看做Core Text绘制中的一行的对象 通过它可以获得当前行的line ascent,line descent ,line leading,还可以获得Line下的所有Glyph Runs
- CTRun 或者叫做 Glyph Run,是一组共享想相同attributes(属性)的字形的集合体
上面说的图片的绘制便是用的CTRun,为图片留位置的方法就是加入一个空白的CTRun,自定义其ascent,descent,width等参数,使得绘制文本的时候留下空白位置给相应的图片。然后图片在相应的空白位置上使用Core Graphics接口进行绘制。 

3.core Text 实践
补充知识 http://deerchao.net/tutorials/regex/regex.htm  正则表达式
在实践中我选择了一个简单地解析方法,利用正则表达式,解析出图片,文字相关信息,判断点击位置,添加点击链接时的跳转。
demo:https://github.com/redihd/CoreTextDemo.git
参考:http://www.raywenderlich.com/4147/core-text-tutorial-for-ios-making-a-magazine-app

你可能感兴趣的:(iOS:图文混编之Core Text 初解)