core Text及沿任意线条的文本

在文本绘制的过程中,使用textview,textfield,及Text Kit的过程中,你所能绘制的文本是只能在水平方向及竖直方向排布的,但在实际的工作中,可能有一类需求是需要你沿着任意一条曲线,可以是弧线,也可以是用户指定的任意曲线,或者用户用手指在屏幕上描绘出来的一条曲线,这个时候即是Core Text为你效劳的时候了

apple给出的官方样例是Drawing Along a Path Using Core Text with Cocoa,这个例子其实是mac开发代码,但可以很轻松地移植到iOS上来,下面详细记录一下使用这个样例的时候遇到的一些问题

编译相关

在查看CTLineRef的定义的时候看到SDK头文件中它是这样描述的

typedef const struct CF_BRIDGED_TYPE(id) __CTLine * CTLineRef;

#define CF_BRIDGED_TYPE(T) __attribute__((objc_bridge(T)))

里面的__attribute__指令已经不是第一次看到了,随手查了一下,链接在这里,而里面objc_bridge(T)的实际作用是告诉编译器,在转换成OC对象时,只能转换成类型T,如果显式转换时会在Xcode中生成警告。

CTLine涉及到一个叫做CTRun的概念,概念,它实际的图形化阐述是

core Text及沿任意线条的文本_第1张图片
CTRun是一组邻近地的有相同的font face和size的glyphs

Core Text相关

CGAffineTransform:是一种二维坐标到二维坐标之间的变换,用来表示二维空间中坐标的线性变换,用来表示某坐标进行位移,旋转,缩放等操作之后所映射到的坐标。

textMatrix:这个矩阵定义的是从文本空间到用户空间的映射,使用CGAffineTransform来表示变换的规则,使用的Core Text API为CGContextSetTextMatrix(context c,CGAffineTransform f); 一个小细节可以反映一点其内部操作,即在设置了tx和ty之后,当前textPosition即等于原点的位置加上(tx,ty)了。直观地理解,可以将CGAffineTransform的tx和ty理解为原点的偏移,而a,b,c,d分量则是进行缩放及旋转的因子,即在glyph绘制的textPosition为原点,以a,b,c,d为因子进行以原点为中心的缩放及旋转。


沿圆弧绘制文本的做法

样例中沿圆弧绘制文本的原理其实很简单,后一个字符在绘制的时候,只要偏移前几个字符所占用的角度即可。

备注:

Core Graphics的默认坐标系是ULO(upper-left-origin)坐标系,即以画布的左上顶点为原点。

CGContextAddArc的最后一个参数clockwise按其SDK的标注,1代表顺时针,其实应该是逆时针,看样子这文档有可能原本是给Mac开发用的,忘记在ios上这里其实是反的,另外角度的增加顺序是从x轴正向为0,顺时针方向增长,也就是Y轴负向方向为π/2

CTRunDraw的神奇之处在于,如果只想绘制run中的一部分glyph,则在指定了run及range之后,从绘制起点开始,到range中的第一个字符显示的位置,是有一段空白的,其实相当于仍给range之前的字符留了位置,只是未将其绘制出来而已,暂时还不知道其缘由是什么。

你可能感兴趣的:(core Text及沿任意线条的文本)