CoreText 即排版引擎,是用来做图文混排的。iOS7推出了在CoreText上面封装的TextKit,可以计算每个字符的高度和位置
富文本排版,除了CoreText还可以用UIWebView实现。
基于CoreText有一下几个好处
- CoreText占用内存更少
- CoreText在渲染界面前就可以精确获得显示内容高度(CTFrame),而UIWebView 只有渲染出内容后,才能获得内容高度还需要JavaScript代码获取
3.CoreText的CTFrame可以后台渲染,UIWebView的内容只能在主线程渲染。
实现过程
1.构造MarkupParase类,去解析接口返回的html标签语言,把html转换成attributeString
2.通过attributeString构造CTFrameSetter
3.通过CTFrameSetter 获得 CTFrame,这个类很关键,拿到这个类即可拿到 CTLine CTTun 即可以获得每个字符的高度 宽度 location
4.图片的处理,先用" "占位,拼接到上面生成的attributeString后面,然后在通过CTRunDelegate callback 拿到图片的size
5.图片的宽高适配
CTFrame& CTLine & CTRun
通过attributeString -> CTFrameSetter -> CTFrame -> CTLine -> CTRun
我们不需要手动创建CTRun,但是可以创建ctrun的delegate来指定文本在绘制时的高度 宽度 排列对齐方法
对于图片的排版,coreText其实是不支持的,我们是在需要展示图片的地方,用一个空白字符代替,同时设置该字符的ctrundelegate 信息为要显示的图片高度和宽度信息,这样最后生成的CTFrame实例,就会在绘制时将图片位置预留出来
本文参照 http://blog.devtang.com/2013/10/21/the-tech-detail-of-ape-client-3/
https://www.raywenderlich.com/578-core-text-tutorial-for-ios-making-a-magazine-app
https://blog.csdn.net/xiaoxiaobukuang/article/details/52368694