CoreText是一种偏底层的技术,主要处理一些排版功能,比如处理字形、字体、行间距等等。说CoreText偏底层,是因为它其实就是Apple基于更底层库Quartz
的一层封装,用起来更方便而已。由于其与Quartz
直接打交道,所以性能也比上层的UIKit
更高效。
这里借用TextKit
的架构图来说明下CoreText的架构
注:TextKit
是在iOS7之后才有的。
CoreText的应用场景很多,特别是一些对文字展示要求特别高的App。比如阅读器、新闻内容页展示、社交软件信息页等等,所以掌握CoreText很有必要。
下面我们自定义了一个View,并重写drawRect
方法:
1、获得当前绘制的上下文;
2、由于Quartz
库中是以左下角为(0,0)原点坐标,而CoreText的原点坐标是右上角,那么就需要上下翻转一下。
3、设置绘制的区域,本例中是矩形,当然你也可以尝试其他设置,比如:CGPathAddArc()
方法设置绘制区域为圆形。
4、创建NSAttributedString
,NSAttributedString
就是CoreText的数据源,所有要绘制的格式都是在NSAttributedString
里面设置,比如字体颜色、字形、段落、行距等等。
5、把NSAttributedString
转化成CTFramesetterRef
,再通过CTFramesetterRef
创建CTFrameRef
,CoreText的核心就是通过CTFrameRef
绘制。
6、绘制。
下面介绍一些常用的属性:
所有属性中,比较复杂的当属kCTParagraphStyleAttributeName
,它主要有如下样式设置:
除了上面复杂的属性以后,是不是发现,使用CoreText绘制内容其实很简单?!记住上面6步就可以了!
但我们都知道,实际在项目中使用的时候,我们不可能这么写,为了能更方便的使用,我们可能需要稍微封装一下。
在.h文件中添加一些常设置的属性(这里只举个例):
记得在初始化时,给它们赋上初始值。
然后在创建NSAttributedString后,添加属性值:
##深入思考
如果我们要在cell中使用到CTDisplayLabel
时,由于需要先计算cell的高度,这时候我们就希望,不要设置CTDisplayLabel
的内容(至少是不需要绘制!),就可以知道此控件适配的高度。要求感觉很难,但Apple已经为我们封装好了方法:CTFramesetterSuggestFrameSizeWithConstraints
,具体实现如下:
这样就可以轻松的计算适配内容的高度了!!
参考:
《iOS进阶开发》 – 唐巧
https://github.com/TTTAttributedLabel/TTTAttributedLabel