本文以问答形式主要讲述Quartz2D的相关内容,参考内容是网上下载的学习视频资料。
他是一个二维的绘图引擎,同时支持iOS和Mac系统
画基本线条,绘制文字,图片,截图,自定义UIView.
当我们的控件样式极其复杂时,可以把控件内部的结构给画出画,就是自定义控件.
图形上下文是用来保存用户绘制的内容状态,并决定绘制到哪个地方的.
用户把绘制好的内容先保存到图形上下文,
然后根据选择的图形上下文的不同,绘制的内容显示到地方也不相同,即输出目标也不相同.
图形上下文的类型有:
Bitmap Graphics Context(位图上下文)
PDF Graphics Context
Window Graphics Context
Layer Graphics Context(图层上下文,自定义UIView取得上下文就是图层上下文.
UIView之所以能够显示就是因为他内部有一个图层)
Printer Graphics Context
首先得要有上下文,有了上下文才能决定把绘制的东西显示到哪个地方去.CGContextRef ctx = UIGraphicsGetCurrentContext();
其次就是这个上下文必须得和View相关联.才能将内容绘制到View上面.在DrawRect方法方法里
步骤:
1.要先自定定UIView
2.实现DrawRect方法
3.在DrawRect方法中取得跟View相关联的上下文.
4.绘制路径(描述路径长什么样).
5.把描述好的路径保存到上下文(即:添加路径到上下文)
6.把上下文的内容渲染到View
DrawRect作用:专用在这个方法当中绘图的.只有在这个方法当中才能取得跟View相关联的上下文.
DrawRect是系统自己调用的, 它是当View显示的时候自动调用.
//1.获取跟View相关联的上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.绘制路径
UIBezierPath *path = [UIBezierPath bezierPath];
//2.1设置起点
[path moveToPoint:CGPointMake(10, 125)];
//2.2添加一根线到某个点
[path addLineToPoint:CGPointMake(200, 125)];
//3.把路径添加到上下文
CGContextAddPath(ctx,path.CGPath);
//4.把上下文的内容渲染到View上面.
CGContextStrokePath(ctx);
第一种方法:重新设置起点,添加一根线到某个点,一个UIBezierPath路径上面可以有多条线.
第二种方法:直接在原来的基础上添加线.把上一条的终点当做下一条线的起点.添加一根线到某个点直接在下面addLineToPoint:
设置这些样式,我们称为是修改图形上下文的状态.
设置线宽:CGContextSetLineWidth(ctx, 20);
设置线段的连接样式: CGContextSetLineJoin(ctx, kCGLineJoinRound);
添加顶角样式:CGContextSetLineCap(ctx, kCGLineCapRound);
设置线的颜色: [[UIColor redColor] setStroke];
画曲线方法比较特殊需要一个控制点来决定曲线的弯曲程度.画曲线方法为:
//先设置一个曲线的起点
[path moveToPoint:CGPointMake(10, 125)];
//再添加到个点到曲线的终点.同时还须要一个controlPoint(控件点决定曲线弯曲的方法程序)
[path addQuadCurveToPoint:CGPointMake(240, 125) controlPoint:CGPointMake(125, 10)];
画矩形直接利用UIBezierPath给我们封装好的路径方法bezierPathWithRect:CGRectMake(x, y, width,height)
(x,y)点决定了矩形左上角的点在哪个位置 (width,height)是矩形的宽度高度
圆角矩形的画法多了一个参数,cornerRadius, bezierPathWithRoundedRect: cornerRadius:
cornerRadius它是矩形的圆角半径.
通过圆角矩形可以画一个圆.当矩形是正方形的时候,把圆角半径设为宽度的一半,就是一个圆.
bezierPathWithRoundedRect:CGRectMake(10, 100, 50, 50) cornerRadius:25
画椭圆的方法为:bezierPathWithOvalInRect:CGRectMake(x, y, width,height)
前两个参数(x,y)分别代码圆的圆心
后面两个参数(width,height)分别代表圆的宽度,与高度.
宽高都相等时,画的是一个正圆, 不相等时画的是一个椭圆
bezierPathWithOvalInRect:CGRectMake(10, 100, 50, 50)
当创建一个UIBezierPath对象之后,我们可以使用它的stroke和fill方法在current graphics context中去渲染它,这两个方法的底层的实现,就是获取上下文,拼接路径,把路径添加到上下文,渲染到View。在调用这些方法之前,我们要进行一些其他的任务去确保正确的绘制path,以及path的设置。
使用UIColor类的方法去stroke和fill想要的颜色。
使用stroke和fill方法进行渲染时,不需要我们手动去获取上下文了,这两个方法会自定获取view的上下文,然后在该view上绘制渲染path对应的路径,stroke是绘制线,fill是填充path对应的封闭区域。
//设置矩形路径 path
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(10, 100, 50, 50)];
//设置边框颜色
[[UIColor greenColor] setStroke];
//设置填充颜色
[[UIColor redColor] setFill];
//设置边框的线宽
path.lineWidth = 5;
//画边框
[path stroke];
//填充内部
[path fill];
首先要确定圆才能确定圆弧,圆孤它就圆上的一个角度嘛。还是使用UIBezierPath的自带的初始化方法。bezierPathWithArcCenter:(CGPoint) radius:(CGFloat) startAngle:(CGFloat) endAngle:(CGFloat) clockwise:(BOOL)
center:圆心
radius:圆的半径
startAngle:起始角度
endAngle:终点角度
clockwise:Yes顺时针,No逆时针
注意:startAngle角度的位置是从圆的最右侧为0度,即时钟的三点钟方向为起点。
//逆时针画一个半圆
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:M_PI clockwise:NO];
[path stroke];
//4分之1圆孤
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:-M_PI_2 clockwise:NO];
[path stroke];
扇形就是在圆弧的基础上进行填充,但是填充需要一个封闭的路径才能填充,所以画扇形的方法为:
1.先画一个圆弧
2.再添加一个一根线到圆心:
3.然后封闭路径:[path closePath],该方法会自动从路径的终点到路径的起点封闭起来,形成一个封闭的路径
4.最后进行填充:[path fill];
//画1/4圆示例
//画圆弧
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:-M_PI_2 clockwise:NO];
//添加一根线到圆心
[path addLineToPoint:CGPointMake(125, 125)];
//关闭路径,从路径的终点到路径的起点
[path closePath];
//画扇形边框
[path stroke];
//用填充的话,它会默认做一个封闭路径,从路径的终点到起点.
[path fill];