iOS学习项目(21-Quartz 2D ①)

来源:互联网 发布:淘宝店铺旺旺号怎么看 编辑:程序博客网 时间:2024/05/16 06:54

①Quartz 2D
概念:二维绘图引擎,同时支持iOS和Mac系统
最大价值:自定义控件

②图形上下文(CGContextRef)
作用:保存绘图信息、状态;决定绘制的输出目标(绘制到什么地方去)

③利用Quartz 2D的绘制过程
绘制过程

④自定义控件的步骤:
1、新建一个类,继承自UIView
2、实现drawRect:方法
在该方法中需要做的事:
a 取得跟当前view相关联的图形上下
b 绘制相应图形内容
c 利用图形上下文将绘制的内容显示(渲染)到view上面

⑤文本(NSString)和图片(UIImage)都有draw方法,可直接绘制到view上,从而不必获取上下。

/** 该方法绘制的文本不换行*/[string drawAtPoint:withAttributes:];/** 该方法绘制的文本在规定的范围内换行*/[string drawInRect:withAttributes:];
/** 该方法绘制的图片会拉伸到整个规定的范围*/[image drawInRect:];/** 该方法绘制的图片会平铺到整个规定的范围。(有点类似html中的图片平铺效果)*/[image drawAsPatterInRect:];

①绘图在iOS中是一个C语言的绘图框架(CoreGraphics.framework)

②项目类添加前缀方式:
工程—>PROJECT/TARGETS—>Class Prefix(右边)

③UIGraphicsGetCurrentContext 获得的上下文是图层上下文(Layer Graphics Context)

④图形上下文栈
作用:将图形上下文的状态(eg.颜色、线宽等)保存在栈中
CGContextSaveGState() 保存当前上下文状态到栈中(进栈)
CGContextRestoreGState() 恢复当前上下文状态 (出栈)

⑤利用Quartz2D对矩形进行操作
CGContextTranslateCTM 平移
CGContextScaleCTM 拉伸[按倍数进行计算]
CGContextRotateCTM 围绕原点(0,0)旋转[负逆正顺]

⑥利用Quartz2D进行图片的剪接步骤:
1 获取上下文
2 指定剪切路径,见多余的剪切掉,关键点CGContextClip

    CGRect imageRect = CGRectMake(0, 0, rect.size.width, rect.size.height);    CGContextAddEllipseInRect(ctx, imageRect);    CGContextClip(ctx);

3 将图片显示到UIView上

⑦NSTimer与CADisplaylink定时器
CADisplayLink多用于UI的刷新(1/60秒刷新一次)
CADisplayLink要添加到主运行循环中才能使用
[link addToRunLoop:forMode:];
参数1:主程序[NSRunLoop mainRunLoop]
参数2:用默认的NSDefaultRunLoopMode
【注意:由于这个该定时器是添加(add)到主运行循环上的,因此最终需要将其移除,使其不占用资源(使用remove或者invalidate)】

⑧drawRect:会在view显示到屏幕的时候调用一次

⑨awakeFrom 该方法会在xib加载完成之后调用,可以在这其中对xib中的view属性进行修改

10.直接进行矩形的绘画
UIRectFill(实心)/UIRectFrame(空心)
利用上述两个方法可以直接将图形滑到UIView上
【但实际的本质是此方法自动关联上下文,并将图形画到UIView上】

11.目前绘制的方式
方式一:获取上下文之后,直接关联上下文进行绘制
方式二:先把所有的路径定义好,然后一次性往上下文中添加。
关于路径的运用步骤:
// 创建路径
CGMutablePathRef = CGPathCreateMutable();
// 设置路径(圆、矩形、弧、线等)
CGPathAdd…
// 把路径添加到上下文中
CGContextAddPath();

12 ARC不会释放C语言创建的资源。
以下有两个问题:
a.什么情况下创建的C语言资源需要释放?
以create、retain、copy创建的数据需要释放。
eg.CGPathCreateMutable
b.C语言资源释放的方式
指定资源的释放方式:eg.CGPathRelease(path)
通用的释放方式:CFRelease()

13 生成水印
步骤:
a 创建一个位图,开启位图上下文

UIGraphicsBeginImageContextWithOptions(<#CGSize size#>, <#BOOL opaque#>, <#CGFloat scale#>)参数1:图案大小参数2:是否为透明参数3:与屏幕分辨率的比例,0.0表示跟屏幕分辨率一致。【相关示例[UIScreen mainScreen].scale

【注意:开启位图上下文之后UIImage再使用drawInRect将不会显示在view上,此时是会绘制在位图环境中。】
b 画背景
[baseImage drawRect:rect];
c 画水印

[waterBaseImage drawInRect:CGRectMake(0, 0, 100, 100)];

d 从位图上下文中获得当前的编辑图片

UIImage * newImage = UIGraphicGetImageFromCurrentImageContext();

e 结束当年的位图编辑

UIGraphicEndImageContext();

f 显示到UIIimageView上

[newImage drawInRect:CGRectMake(0, 0, 100, 100)];
0 0