Quartz 2D的概述
Quartz 2D是一个二维绘图引擎,同时支持 ios 和 Mac系统。Quartz 2D的应用范围:
- 绘制图形:线条、三角形、矩形、圆、弧等;
- 绘制文字
- 绘制\生成图片(图像)
- 读取\生成PDF
- 截图\裁剪图片
- 自定义UI控件
Quartz 2D 在ios开发中的价值
为了便于搭建美观的UI界面,ios提供了UIKit框架,里面有各种各样的UI控件,例如UILabel、UIImageView、UIButton等;
利用UIKit框架提供的空间,拼拼凑凑,能搭建和实现一些简单、常见的UI界面。但是,有些UI界面极其复杂,而且比较个性化,用普通的UI空间无法实现,这是可以利用Quartz 2D技术将控件内部的结构画出来,自定义控件的样子。
其实,ios中大部分控件的内容都是通过Quartz 2D画出来的。
图形上下文
图形上下文
是一个CGContextRef类型的数据,其作用就是:
保存绘图信息 和 绘图状态
决定绘制的输出目标(绘制到什么地方去?)
输出目标可以是PDF文件、Bitmap或者显示器的窗口上
相同的一套绘制序列,指定不同的Graphics Context,就可以将相同的图像绘制到不同的目标上
Quartz 2D提供以下几种类型的Graphics Context
自定义View
如何利用Quartz 2D 绘制东西到view上?
首先,需要先获取图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去
其次,获取的图形上下文,必须跟view相关联,才能将内容绘制到view上面。
自定义view的步骤
新建一个类,继承自UIView
实现- (void)drawRect:(CGRect)rect
方法,然后在这个方法中:
(1)取得跟当前view相关联的图形上下文
(2)绘制相关的图形内容
(3)利用图形上下文将绘制的所有内容渲染显示到view上面
- (void)drawRect:(CGRect)rect注意点
- (void)drawRect:(CGRect)rect 这个方法比较独特的地方是,
当系统自动调用这个方法时,会在drawRect内部自动创建跟view相关联的上下文
;
当开发者手动调用的时候,是不会创建上下文的!!
我们如果需要调用drawRect方法去绘制的时候,可以用[self setNeedIfDisplay]
这个方法来代替。
图形上下文的结构
图形上下文可以如果要把路径绘制到页面上时,我们可以调用如下的代码:
CGContextStrokePath(CGContextRef cg_nullable c)
这句代码的意思是:
取出上下文当中所有绘制的路径
把上下文当中的状态应用到所有路径当中
绘制指定的图形上下文中
因此,我们就需要了解一下图形上下文的结构:
- 当我们获取图形上下文的时候,内存开启了一个上下文的空间,空间有两个区域:
路径区域(用来存取添加的路径)
、状态区域(用来描述路径的状态的区域)
; - 当我们调用CGContextStokePath的时候,会先从路径区域中取出所有的路径,然后把状态区域里面的状态都添加都所有的路径上,最后再绘制到页面中。
当然系统还提供了保存上下文状态栈的代码,如下图: