Quartz 2D是一个二维图形绘制引擎,我们可以使用Quartz 2D 实现基本路径的绘制、透明度、描影、绘制阴影、透明层、颜色管理、反锯齿、PDF文档生成和PDF元数据访问。在需要的时候,Quartz 2D还可以借助图形硬件的功能。
一、自定义View
利用Quartz 2D绘制东西到View上,首先要有图形上下文用于保存绘图信息,再把内容绘制到View上。
自定义View的步骤:
1、新建一个继承自UIView的类;
2、实现- (void)drawRect:(CGRect)rect方法,在这个方法中实现自定义;
获取跟当前View想关联的图形上下文
绘制相应的图形内容
利用图形上下文将绘制的所有内容渲染显示到View上面
二、基础绘图
第一步:获得图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
第二步:设置图形信息、图形状态
第三步:把图形信息渲染到View上
CGContextStrokePath(ctx); 边界
CGContextFillPath(ctx); 填充
CGContextDrawPath(ctx, kCGPathFillStroke); 边界和填充
绘制线条只能以边界形式绘制,不能填充
1、绘制线条
2、绘制三角形
3、绘制圆、圆弧
绘制弧的方法
坐标是以X轴的正坐标方向为角度0开始计算
c 当前图形上下文
x 圆心的x值
y 圆心的y值
radius 半径
startAngle 开始角度
endAngle 结束角度
clockwise 绘制方向:0:表示顺时针,1:表示逆时针
CGContextAddArc(CGContextRef _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
4、绘制图片
5、绘制文字
6、图形上下文栈
主要作用:备份保存,相当于还原上下文初始状态,不用手动复原。
当需要连续绘制多个不同样式的图形在一起的时候,在设置当前绘图信息和绘图状态之前,保存一份图形上下文到栈区,在绘制下一个图形时,把刚才保存的那个图形上下文出栈,相当于你得到了上一个图形上下文的初始状态。
图形上下文的保存和出栈都是成对出现的。
CGContextSaveGState(ctx); // 将当前图型上下文保存到一个栈里面
CGContextRestoreGState(ctx); // 将图形上下文出栈
7、矩阵操作
我们知道利用transform属性的旋转、平移、缩放等默认都是以中心点为基准点的。
而在图形上下文中默认是以0,0点作为基准点。
矩阵操作里的旋转则相对难理解一点。可以通过先平移、再旋转、再上移来达到效果
例如:实现旋转45度
CGContextTranslateCTM(ctx, rect.size.width 0.5, rect.size.height 0.5);
CGContextRotateCTM(ctx, M_PI_4);
CGContextTranslateCTM(ctx, -rect.size.width 0.5, -rect.size.height 0.5);
三、绘图的三种方式
1、直接图形上下文绘制
2、通过创建path,每一个图形对应一个绘图路径,优点是会比较清晰,增加可读性,缺点是代码多一些
3、通过UIBezierPath绘图
四、绘图应用
1、在自定义View内裁剪图片
(1)按照需求设定一个裁剪的封闭图形区域
(2)绘制你要裁剪的图片到这个封闭区域内,超出部分会裁剪调。
按照这个思路你可以裁剪你想要得到的图形图片。
2、脱离- (void)drawRect:(CGRect)rect 方法实现裁剪图片
给UIImage做一个分类,实现常用的裁剪圆形头像的小功能
3、通过赋值属性改变绘制圆的大小
4、简单的雪花飘落
5、截屏截图
6、制作水印图