Quartz2D

来源:互联网 发布:xbox360体感游戏知乎 编辑:程序博客网 时间:2024/06/06 15:34

一、概述

Quartz2D的API是纯C语言的,它是一个二维绘图引擎,同时支持iOS和Mac系统。Quartz2D的API来自于Core Graphics框架,数据类型和函数基本都以CG作为前缀。通常,我们可以使用系统提供的控件去完成大部分UI,但是有些UI界面极其复杂、而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,类似自定义控件。其实,iOS中大部分控件的内容都是通过Quartz2D画出来的,因此,Quartz2D在iOS开发中很重要的一个价值是:自定义view(自定义UI控件)。

Quartz 2D能完成的工作:

绘制图形 : 线条\三角形\矩形\圆\弧等;

绘制文字;

绘制\生成图片(图像);

读取\生成PDF;

截图\裁剪图片;

自定义UI控件;

… …

 

二、图形上下文(Graphics Context)

图形上下文(Graphics Context):是一个CGContextRef类型的数据。

图形上下文的作用

(1)保存绘图信息、绘图状态

(2)决定绘制的输出目标(绘制到什么地方去?)

(输出目标可以是PDF文件、Bitmap或者显示器的窗口上)

图片 1

相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上。

Quartz2D提供了以下几种类型的Graphics Context

(1)Bitmap Graphics Context

(2)PDF Graphics Context

(3)Window Graphics Context

(4)Layer Graphics Context

(5)Printer Graphics Context

1639

将当前的上下文copy一份,保存到栈顶(那个栈叫做”图形上下文栈”):

 

将栈顶的上下文出栈,替换掉当前的上下文(清空之前对于上下文设置):

 

三、使用Quartz2D自定义View

1、Quartz2D自定义view

如何利用Quartz2D自定义view?(自定义UI控件)如何利用Quartz2D绘制东西到view上?

首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去。

其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面。

自定义view的步骤:

(1)新建一个类,继承自UIView

(2)实现- (void)drawRect:(CGRect)rect方法,然后在这个方法中

(a)取得跟当前view相关联的图形上下文

(b)绘制相应的图形内容

例如:画1/4圆(扇形)

(3)利用图形上下文将绘制的所有内容渲染显示到view上面

 

注:

完整代码:

运行效果:

Snip20170206_1

 

2、核心方法drawRect:

  • 为什么要实现drawRect:方法才能绘图到view上?
    • 因为在drawRect:方法中才能取得跟view相关联的图形上下文
  • drawRect:方法在什么时候被调用?
    • 当view第一次显示到屏幕上时(被加到UIWindow上显示出来)
    • 调用view的setNeedsDisplay或者setNeedsDisplayInRect:时.
  • 注意4点:
    • 手动调用drawRect:方法,不会自动创建跟View相关联的上下文。应该
      调用setNeedsDisplay方法,系统底层会自动调用drawRect,告诉系统重新绘制View.这样,系统底层会自动创建跟View相关联的上下文
    • setNeedsDisplay底层会调用drawRect,并不是立马调用的.只是设了一个调用的标志.调用时刻是等下一次屏幕刷新时才去调用drawRect。屏幕每一秒刷新30-60秒次,所以1秒调用drawRect方法大概30-60次,速度非常快哦
    • view内部有个layer(图层)属性,drawRect:方法中取得的是一个Layer Graphics Context,因此,绘制的东西其实是绘制到view的layer上去了
    • View之所以能显示东西,完全是因为它内部的layer

 

3、Quartz2D绘图的代码步骤

第一步:获得图形上下文:

第二步:拼接路径(下面代码是绘制一条线段):

 

第三步:绘制路径:

 

四、Quartz2D重要函数

1、常用拼接路径函数

新建一个起点

 

添加新的线段到某个点

 

添加一个矩形

 

添加一个椭圆

 

 

添加一个圆弧

 

 

2、常用绘制路径函数

一般以CGContextDraw、CGContextStroke、CGContextFill开头的函数,都是用来绘制路径的。

 

Mode参数决定绘制的模式

 

绘制空心路径

 

 

绘制实心路径

 

3、矩阵操作函数

利用矩阵操作,能让绘制到上下文中的所有路径一起发生变化。

缩放:

 

旋转:

 

平移:

 

4、其他常用函数

设置线段宽度

 

设置线段头尾部的样式

 

设置线段转折点的样式

 

设置颜色

 

五、Quartz2D的内存管理

关于Quartz2D内存管理,有以下原则:

(1)使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露。

(2)使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放

(3)如果retain了一个对象,不再使用时,需要将其release掉。

(4)可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。

(5)也可以使用Core Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数。

 

六、Quartz2D使用案例

1、画矩形、正方形

运行效果:

Snip20170206_3

 

2、画扇形

除上面“二、使用Quartz2D自定义View”中的方法外,也可以使用OC中自带画图方法实现,如下:

运行效果:

Snip20170206_4

注:

判断一个点是否在一个矩形框内

 

3、画圆形

运行效果:

Snip20170206_5

 

4、画圆角矩形

运行效果:

Snip20170206_6

 

5、画直线

运行效果:

Snip20170206_7

 

6、画曲线

本塞尔曲线原理:

2364940-93c60e25992fecb7

运行效果:

Snip20170206_8

 

7、画饼图

方法1:

运行效果:

Snip20170206_9

 

方法二:

 

注:

如果想实现点击以下变换颜色可以加上如下代码:

 

8、绘制文字

运行效果:

Snip20170206_10

 

9、加水印

运行效果:

Snip20170206_11

 

10、屏幕截图

运行效果:

截图而已,就跟普通截图一样,自己试。

 

以上就是关于Quartz2D一些常用的案例,Quartz2D还可以实现更多效果,具体的根据需求去实现

0 0
原创粉丝点击