工具iOS图层绘制iOS开发技术分享

用贝塞尔曲线画矢量图

2017-03-21  本文已影响220人  熊妹妹

贝塞尔概念

首先了解贝塞尔曲线,网上有很多资料查看1查看2

这两篇看完,就足够了解后面要说的内容了

绘制基础

从iOS3.2开始,支持用UIBezierPath来创建基于矢量的路径,它是对Core Graphics框架路径相关特性的封装。可以通过它来定义比如椭圆或者矩形等形状,也可以定义多个直线或曲线组成的形状。同时支持绘制轮廓,填充内容,甚至剪裁。

UIBezierPath对象是对CGPathRef类型的封装。我们可以用任意的直线或曲线路径来组成矢量图,每一段路径都包含一个或多个点和诠释这些点的绘制方法。每一条链接的直线和曲线路径构成自路径subpath。每一条线的终点是下一条线的起点。一个UIBezierPath对象包含一个或多个子路径来定义完整的路径。

创建路径过程:

  1. 创建一个路径对象
  2. 设置一些绘制属性参数,比如线宽lineWidth等画图属性,或fillColor等填充属性。
  3. 用moveToPoint:方法设置起点。
  4. 添加一条直线或者曲线来定义子路精。
  5. 如果有需要,用closePath是子路径闭合,方法是直接在起点和终点间绘制一条直线。
  6. 如果有需要,重复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. 曲线

曲线通过以下两个方法实现:

三次需要4个参数,二次需要3个参数。第一个参数都是上一条线的终点。贝塞尔曲线在第一部分提到,看明白就很容易理解这里面的参数了。

3. 弧线

通过addArcWithCenter: radius: startAngle: endAngle: clockwise:方法实现,参数通过方法名都看得懂了。

其他

绘制椭圆形和矩形

  1. 椭圆形:用bezierPathWithOvalInRect:方法传入的rect矩形参数绘制一个内切曲线。当传入的rect是一个正方形时,绘制的图像是一个内切圆;当传入的rect是一个长方形时,绘制的图像是一个内切椭圆。

  2. 矩形:用bezierPathWithRect:方法

  3. 用Core Graphics方法修改路径

  4. 用stroke和fill方法在current graphics context中去渲染路径

上一篇 下一篇

猜你喜欢

热点阅读