CAShapeLayer与UIBezierPath(加动画)

作者: 欣东 | 来源:发表于2016-05-07 21:49 被阅读2961次

    前言

    1. UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等形状 。我们使用直线、弧(arc)来创建复杂的曲线形状。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。
    2. CAShapeLayer: 继承于CALayer。 每个CAShapeLayer对象都代表着将要被渲染到屏幕上的一个任意的形状(shape)。具体的形状由其path(类型为CGPathRef)属性指定。 普通的CALayer是矩形,所以需要frame属性。CAShapeLayer它本身没有形状,它的形状来源于其属性path 。CAShapeLayer有不同于CALayer的属性,它从CALayer继承而来的属性在绘制时是不起作用的。

    具体用法看代码

    仅仅使用UIBezierPath来绘图的话,需要在view的drawRect方法里实现,详细可以看MyView的drawRect方法

    //
    //  MyView.m
    //  CAShapeLayerAndUIBezierPath
    //
    //  Created by 蔡欣东 on 16/4/21.
    //  Copyright © 2016年 蔡欣东. All rights reserved.
    //
    
    #import "MyView.h"
    
    @implementation MyView
    
    - (void)drawRect:(CGRect)rect {
        [self simpleDraw];
        [self drawARCPath];
        [self drawTrianglePath];
        [self drawSecondBezierPath];
    }
    
    //画圆角矩形
    -(void)simpleDraw{
        UIBezierPath* path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 100, 100) cornerRadius:20];
        path.lineWidth = 5;
        
        //设置填充颜色
        UIColor* fillColor = [UIColor greenColor];
        [fillColor set];
        [path fill];
        
        //设置线的颜色,需要在填充颜色之后设置
        UIColor* lineColor = [UIColor redColor];
        [lineColor set];
        [path stroke];
    }
    
    
    //画圆弧
    -(void)drawARCPath{
        UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(20, 150) radius:100 startAngle:0 endAngle:M_PI*90/180 clockwise:YES];
        
        //连接处的样式
        path.lineCapStyle = kCGLineCapRound;
        //连接方式
        path.lineJoinStyle = kCGLineJoinRound;
        path.lineWidth = 5;
        
        UIColor* lineColor = [UIColor redColor];
        [lineColor set];
        [path stroke];
    }
    
    //画三角形
    -(void)drawTrianglePath{
        UIBezierPath* path = [UIBezierPath bezierPath];
        //设置起点
        [path moveToPoint:CGPointMake(20, 300)];
        [path addLineToPoint:CGPointMake(150, 400)];
        [path addLineToPoint:CGPointMake(20, 400)];
        [path closePath];
        
        path.lineWidth = 5;
        
        UIColor* fillColor = [UIColor greenColor];
        [fillColor set];
        [path fill];
        
        UIColor* lineColor = [UIColor redColor];
        [lineColor set];
        [path stroke];
        
        
    }
    
    //画二次贝尔曲线
    -(void)drawSecondBezierPath{
        UIBezierPath* path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(200, 150)];
        [path addQuadCurveToPoint:CGPointMake(200, 300) controlPoint:CGPointMake(50, 50)];
        path.lineWidth = 5;
        
        UIColor* lineColor = [UIColor redColor];
        [lineColor set];
        [path stroke];
    }
    
    @end
    

    用CAShapeLayer和UIBezierPath画图,以及结合CAAnimation实现一个绘图动画

    动画效果:

    gif1.gif
    //
    //  ViewController.m
    //  CAShapeLayerAndUIBezierPath
    //
    //  Created by 蔡欣东 on 16/4/21.
    //  Copyright © 2016年 蔡欣东. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "MyView.h"
    @interface ViewController (){
        CAShapeLayer *layer;
    }
    
    @end
    
    
    @implementation ViewController
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //仅仅使用UIBezierPath的话,需要在view的drawRect方法里实现,详细可以看MyView的drawRect方法
    //    CGFloat W = [UIScreen mainScreen].bounds.size.width;
    //    CGFloat H = [UIScreen mainScreen].bounds.size.height;
    //    MyView* myView = [[MyView alloc]initWithFrame:CGRectMake(0, 0, W, H)];
    //    myView.backgroundColor = [UIColor whiteColor];
    //    [self.view addSubview:myView];
        
        
        
        
        //CAShapeLayer和UIBezierPath画图
        
        layer = [CAShapeLayer layer];
        layer.fillColor = [UIColor clearColor].CGColor;
        layer.lineWidth =  20.0f;
        layer.lineCap = kCALineCapRound;
        layer.lineJoin = kCALineJoinRound;
        layer.strokeColor = [UIColor redColor].CGColor;
        [self.view.layer addSublayer:layer];
        
        // 创建贝塞尔路径
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:80 startAngle:0 endAngle:M_PI*2 clockwise:NO];
        
        
        // 关联layer和贝塞尔路径
        layer.path = path.CGPath;
        
        // 创建Animation
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        animation.fromValue = @(0.0);
        animation.toValue = @(1.0);
        layer.autoreverses = NO;
        animation.duration = 3.0;
        
        // 设置layer的animation
        [layer addAnimation:animation forKey:nil];
        animation.delegate = self;
        
        
        int count = 16;
        for (int i = 0; i<count; i++) {
            CAShapeLayer* lineLayer = [CAShapeLayer layer];
            lineLayer.fillColor = [UIColor clearColor].CGColor;
            lineLayer.strokeColor = [UIColor yellowColor].CGColor;
            lineLayer.lineWidth = 15.0f;
            lineLayer.lineCap = kCALineCapRound;
            lineLayer.lineJoin = kCALineCapRound;
            [self.view.layer addSublayer:lineLayer];
            
            UIBezierPath* path2 = [UIBezierPath bezierPath];
            int x = 200+100*cos(2*M_PI/count*i);
            int y = 200-100*sin(2*M_PI/count*i);
            int len = 50;
            [path2 moveToPoint:CGPointMake(x, y)];
            [path2 addLineToPoint:CGPointMake(x+len*cos(2*M_PI/count*i), y-len*sin(2*M_PI/count*i))];
            lineLayer.path = path2.CGPath;
            [lineLayer addAnimation:animation forKey:nil];
        }
    
    }
    
    //animation结束回调
    -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
        NSLog(@"yes");
        layer.fillColor = [UIColor redColor].CGColor;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        
    }
    
    @end
    

    Demo地址:https://github.com/caixindong/SomeDemoForYou

    相关文章

      网友评论

      本文标题:CAShapeLayer与UIBezierPath(加动画)

      本文链接:https://www.haomeiwen.com/subject/yuksrttx.html