贝塞尔概念
这两篇看完,就足够了解后面要说的内容了
绘制基础
从iOS3.2开始,支持用UIBezierPath来创建基于矢量的路径,它是对Core Graphics框架路径相关特性的封装。可以通过它来定义比如椭圆或者矩形等形状,也可以定义多个直线或曲线组成的形状。同时支持绘制轮廓,填充内容,甚至剪裁。
UIBezierPath对象是对CGPathRef类型的封装。我们可以用任意的直线或曲线路径来组成矢量图,每一段路径都包含一个或多个点和诠释这些点的绘制方法。每一条链接的直线和曲线路径构成自路径subpath。每一条线的终点是下一条线的起点。一个UIBezierPath对象包含一个或多个子路径来定义完整的路径。
创建路径过程:
- 创建一个路径对象
- 设置一些绘制属性参数,比如线宽lineWidth等画图属性,或fillColor等填充属性。
- 用moveToPoint:方法设置起点。
- 添加一条直线或者曲线来定义子路精。
- 如果有需要,用closePath是子路径闭合,方法是直接在起点和终点间绘制一条直线。
- 如果有需要,重复345步骤添加子路径。
创建路径时,应该让你绘制的点是相对于(0,0)原点点的。因为这样后面可以方便的移动路径。绘制是应用当前图像上下文的坐标系。如果路径是相对于原点的,就可以很容易的移动并做撤销等操作,你只需要用平移的防射变换来修改它。
绘制路径会用到stroke和fill的一些方法,这些方法在当前图形上下文运行。运行过程包含用路径对象的属性栅格化直线和曲线。栅格化过程不需要修改路径对象,因此你可以用同样的路径对象绘制在同样或不同的上下文绘制多次。
上代码,前面几条会理解更清晰
CAShapeLayer *layer1 = [CAShapeLayer layer];
layer1.bounds = CGRectMake(0, 0, 200, 200);
layer1.position = self.view.center;
layer1.backgroundColor = [UIColor colorWithRed:0.9 green:0.3 blue:0.3 alpha:0.3].CGColor;
UIBezierPath *path = [UIBezierPath bezierPath]; //步骤1
path.lineWidth = 1.; //步骤2
path.usesEvenOddFillRule = NO; //步骤2
[path moveToPoint:CGPointMake(50, 0)]; //步骤3
[path addCurveToPoint:CGPointMake(0, 50)
controlPoint1:CGPointMake(50, 25)
controlPoint2:CGPointMake(25, 50)]; //步骤4
[path addCurveToPoint:CGPointMake(-50, 0)
controlPoint1:CGPointMake(-25, 50)
controlPoint2:CGPointMake(-50, 25)];
[path addCurveToPoint:CGPointMake(0, -50)
controlPoint1:CGPointMake(-50, -25)
controlPoint2:CGPointMake(-25, -50)];
[path addCurveToPoint:CGPointMake(50, 0)
controlPoint1:CGPointMake(25, -50)
controlPoint2:CGPointMake(50, -25)];
[path closePath]; //步骤5
CGAffineTransform transform = CGAffineTransformMakeTranslation(100, 100);
[path applyTransform:transform]; //步骤6
layer1.path = path.CGPath;
layer1.fillColor = [UIColor whiteColor].CGColor;
layer1.strokeColor = [UIColor blueColor].CGColor;
[self.view.layer addSublayer:layer1];
效果
线段类型
1. 直线
直线通过addLineToPoint:方法传入路径的终点,和上一条线的终点绘制一条直线。
2. 曲线
曲线通过以下两个方法实现:
- 三次贝塞尔曲线:addCurveToPoint:controlPoint1:controlPoint2:
- 二次贝塞尔曲线:addQuadCurveToPoint:controlPoint:
三次需要4个参数,二次需要3个参数。第一个参数都是上一条线的终点。贝塞尔曲线在第一部分提到,看明白就很容易理解这里面的参数了。
3. 弧线
通过addArcWithCenter: radius: startAngle: endAngle: clockwise:方法实现,参数通过方法名都看得懂了。
其他
绘制椭圆形和矩形
椭圆形:用bezierPathWithOvalInRect:方法传入的rect矩形参数绘制一个内切曲线。当传入的rect是一个正方形时,绘制的图像是一个内切圆;当传入的rect是一个长方形时,绘制的图像是一个内切椭圆。
矩形:用bezierPathWithRect:方法
用Core Graphics方法修改路径
用stroke和fill方法在current graphics context中去渲染路径