我们接着上一篇讲,上篇已经大概的讲了下单纯的绘制文字,但是一篇文章一般都会有几张图片的,而且是嵌入文字内的,不一定是将上下文字换行来处理的,我们今天就讲一下如果图片嵌入了文字该如何处理。
思路
我们已经可以正常绘制富文本了,也可以通过CTLine
和CTRun
来分别对每行或者每行的绘制对象来进行干预来完成绘制。
我们来简单捋一下图文混排的思路,一些准备操作和之前是一样的,只是在将富文本传递给CTFramesetterRef
工厂对象时候需要将图片插入富文本中,因为Core Text
无法直接绘制图片,只能是将相关的代理传递给一个既定的富文本,之后遍历CTRun
来识别再去使用Core Graphics
对图片进行绘制在View上面,而属性字符串里面只能存一些高度距离相关的属性。
Demo
图文混排
1 |
|
1 |
|
代码详解
首先我们可以看到上面一段代码和之前一篇的遍历CTRun的几乎没有区别,只有 4.2 和 7.2 的部分有增添,那么我们分别讲一下这两段
1
首先我们先看一下第二段的标号为 1 的代码中
1 | //创建一个CTRun代理回调的结构体 |
1 | //创建代理,将参数传到代理对象中 |
2
这一段就是给代理回调结构体设置的各个回调,其中返回的形参为
1 | NSString *sizeStr = NSStringFromCGSize(size); |
中初始化代理时候传入的实参,因为返回时候是个指针,所以所有类型的对象都可以,也可以自定义对象进行传递。
3
我们可以看到 7.2 部分调用了这个方法,这个方法的作用就是判断遍历出来的 CTRun
是否是自己要绘制的富文本,返回一个布尔值。
4
方法的前面的判断就是判断是否有imageName,我们也可以根据需求将一个默认图绘制上去,我们着重讲一下计算图片绝对布局的算法。
1 | //距离顶部基线的距离 |
5
两个形参分别是需要绘制的图片和图片的绝对布局,我们直接绘制既可。
我将图文混排增加的代码直接写成了各个方法,更灵活更易懂,这个地方我们可以自定义一个类来专门处理图文相关的代理等一系列的参数,YYText
就是自定义了一个YYTextRunDelegate
这个类来处理相关的,下一篇我们将继续写点击事件相关
英文水平贼渣的我又看了好久英文文档和博客总结的,如果转载请附上链接https://coderwong.com/2018/07/09/CoreTextFix/,万分感谢