美文网首页
iOS CoreText(一)

iOS CoreText(一)

作者: 军_andy | 来源:发表于2017-04-06 17:42 被阅读299次

刚好最近项目中有用到CoreText,最近也看了看YYText中YYLabel的源码,总结一下

CoreText实现

结构.png

看上图,我们可以知道,一个View包括CTFrameCTFrame中间包括许多行CTLine,而一个CTLine中包括许多CTRun

我们主要说说CTLineCTRun

CTLine其实比较好理解,当我们用UILabel显示文本内容时,一行就是一个CTLine,一个CTLine中有一个或者多个CTRunCTRun的个数取决于文本的具体内容,如果一行里面有两种大小的文字或者两种颜色不通的文字,可以简单的认为这一行就有两个CTRun,其中CTRun还可以是图片

我们再来说说文字结构
文字结构.gif

Origin是原点,后面获取的坐标都是该坐标,宽度是可以直接获取的,而高度则是由Ascent和Descent相加得到

具体实现

具体实现过程中主要用到了NSMutableAttributedString中的Attributes

NSMutableAttributedString *astring = _textString;
//获取上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//设置坐标系
//设置字形的变换矩阵为不做图形变换
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
//平移方法,将画布向上平移一个屏幕高度
CGContextTranslateCTM(context, 0, self.bounds.size.height);
//缩放方法,x轴缩放系数为1,则不变,y轴缩放系数为-1,则相当于以x轴为轴旋转180度
CGContextScaleCTM(context, 1, -1);
//创建path
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, self.bounds);
 
CTFramesetterRef frameRef = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)astring);
CTFrameRef frame = CTFramesetterCreateFrame(frameRef, CFRangeMake(0, astring.length), path, NULL);
CTFrameDraw(frame, context);

CFRelease(path);
CFRelease(frame);
CFRelease(frameRef);

首先是获取上下文
由于屏幕的坐标系是原点在左上角,然后x,y轴的箭头方向分别是向右和向下,与Quartz 2D坐标系不一样,Quartz 2D坐标系是原点在左下角,x,y轴的方向分别是向右和向上,CGContextSetTextMatrix () ,CGContextTranslateCTM (), CGContextScaleCTM ()这三句主要就是转换坐标系,感兴趣的同学可以试着改改其中的参数
然后再创建path,这个path主要是为了后面的CTFrame服务
根据文本内容创建CTFramesetterRef
根据CTFramesetterRef Range path来得到CTFrameRef
最后通过CTFrameDraw来将CTFrameRef绘制在上下文中
因为这些都是C方法,所以要自己来释放,通过CFRelease来释放
加这段代码放到View的drawRect中就可以运行了

下一篇将介绍用这种方式进行图文混排
最后一篇介绍YYText中异步的实现方式

相关文章

  • 资料篇

    参考资料 官方文档iOS文字排版(CoreText)那些事儿IOS CoreText.framework --- ...

  • 技术在于交流,知识在于收集(五)

    收集的一些iOS开发技术博客与牛人共同进步 CoreText: CoreText入门 CoreText笔记 Par...

  • CoreText的学习使用

    整理CoreText资料 恶补中 Swift之CoreText排版神器(长篇高能)iOS_NSAttributed...

  • CoreText的简单使用(一)

    CoreText的简单使用(一) 介绍: 读唐巧的《iOS开发进阶》,关于CoreText的笔记。借用介绍:“使用...

  • iOS开发CoreText使用说明书

    1. CoreText框架基础 CoreText是Mac OS和iOS系统中处理文本的low-level API,...

  • 富文本 CoreText 和 TextKit

    一、CoreText CoreText是Mac OS和iOS系统中处理文本的底层API, 不管是使用OC还是swi...

  • iOS CoreText(一)

    刚好最近项目中有用到CoreText,最近也看了看YYText中YYLabel的源码,总结一下 CoreText实...

  • iOS gif表情图文混排

    效果如下: 关于图文混排大家应该都非常熟悉了, iOS7之前是用CoreText实现, 用CoreText比较麻烦...

  • CoreText 学习笔记(上)

    唐巧原博客地址:基于 CoreText 的排版引擎 CoreText是相对来说非常底层的框架,在日常的iOS开发过...

  • TextKit

    一、简介 iOS中实现富文本的方式一般有三种:第一种是CoreText,这两天看了唐巧的介绍CoreText的文章...

网友评论

      本文标题:iOS CoreText(一)

      本文链接:https://www.haomeiwen.com/subject/qzjqattx.html