IOS中绘图的方式介绍
IOS中貌似绘图的方式还挺多的,有
- Core Graphics/QuartZ 2D
- UIKit
- OpenGL ES
Core Graphics/QuartZ 2D是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。
上面的解释要是感觉太晦涩的话,记住下面一句就够了:Core Graphics/QuartZ 2D底层,功能强大,效率高。CG开头的那一票东西都属于这个框架的。
UIKit绘图方式就是UIBezierPath这类UI开头的,绘图的,平常感觉看不懂的东西,其实这种绘图方式是封装了CG的作图,给你封装了一些常用的东西,但是不常用的东西可能就没有,但是一般的需求足够满足了,效率上也不会比CG绘图低上多少,在手机硬件过剩的年代这早就不是问题了。
至于 OpenGL ES,谁告诉我一下是什么东西、不甚感激,既然是这样,那我就讲Core Graphics/QuartZ 2D绘图方式好了。
几个绘图中的概念
- context:上下文,不知道是什么翻译,反正记事开始就听这个词到烂,这里把context比作是一块画布还是比较贴切的,ios绘图的方法都需要传一个上下文context,UIView中跑到drawRect这个方法的时候会自己去创建一个默认的context。我们在重写UIView的drawRect的方法里调用UIGraphicsGetCurrentContext()去获取这个默认的context。
- path:路径,ios绘图可以想象为你拿着一支笔去画图,画几条线或几个点从而形成一个路径,IOS的绘图都是从路径开始的,先有路径才有一切,有了路径之后才可以在这个路径上进行填色或者描边
- stroke,fill 描边和填充,每个路径都需要填充或者描边后才能在视图中看见,他们都各自有很多样式可以设置,常见的有颜色、粗细、渐变,连接样式等等。
- 画图可以使用默认路径画,或者单独创建path画图,对应画图的api并不完全相同,是两组名称相似的api,两组api常用的方法如下
CGContextMoveToPoint设置起点
CGContextClosePath 连接起点和当前点
CGPathCreateMutable 类似于 CGContextBeginPath
CGPathMoveToPoint 类似于 CGContextMoveToPoint
CGPathAddLineToPoint 类似于 CGContextAddLineToPoint
CGPathAddCurveToPoint 类似于 CGContextAddCurveToPoint
CGPathAddEllipseInRect 类似于 CGContextAddEllipseInRect
CGPathAddArc 类似于 CGContextAddArc
CGPathAddRect 类似于 CGContextAddRect
CGPathCloseSubpath 类似于 CGContextClosePath
CGContextAddPath函数把一个路径添加到graphics
上面方法看不懂没关系,后面再说,先说说画图的一个步骤
对,绘图就是在重写的drawRect方法中话的,或者类似的方法,比如layer中的类似方法也可以画,这个方法相信大家见的绝对不少,这个方法就是给你一个画画的空间size,然后给你自由发挥,其实在这个方法执行完毕到UIView展示出来之间,UIView自己还画了一些东西,比如说你调用addSubView添加的view,但你在drawRect中画的东西会在最底下。
在drawRect中获取context,因为基本上所有绘图的方法都必须传当前的一个context,所以你一定要先获取context,需要特别注意的是每次调用drawRect的时候你所获取的context是不一样的,所以不能把context保存起来,应该每次都去重新获取。获取context基本上也是drawRect这个方法重写起来的第一行代码的标配,在这个获取到的context中包含了一支无形的笔,你可以通过context来配置笔的粗细,笔的颜色等等...
“描”出路径,为什么用描呢,因为这里不是真正的就画出来了,只是虚的描出了路径,描出路径这是一切绘图的开始,或许你用过PS,仔细想想在你P图的时候得先圈一个工作的路径,以后所有的操作都只会在这个指定的路径上面执行,不会影响到路径以外。
最后一部对上面描出的路径进行描边或者填充,这一步才真正把图像给展示出来。
未完待续