美文网首页Core Animation
iOS CoreAnimation教程 第二篇

iOS CoreAnimation教程 第二篇

作者: 人魔七七 | 来源:发表于2018-03-02 15:33 被阅读26次

    今天主要讲解图层的strokeStart strokeEnd 属性。

    strokeStart strokeEnd两个属性的默认值都是0-1 ,值的大小大概意思是描述了有多少路径画完。想象下你小时候写英文时候一笔下来的过程,下面会用动画描述生成的过程。

    一般这两个属性会结合CAShaperLayer使用,看两个效果。


    具体代码实现

        UIBezierPath *rectanglePath = [UIBezierPath bezierPath];
        
      //这个是第二个效果
        [rectanglePath moveToPoint:CGPointMake(0, 177)];
        [rectanglePath addLineToPoint:CGPointMake(185, 177)];
        [rectanglePath addLineToPoint:CGPointMake(185, 0)];
        [rectanglePath addLineToPoint:CGPointMake(0, 0)];
        [rectanglePath addLineToPoint:CGPointMake(0, 177)];
        [rectanglePath closePath];
    
        //这个是第一个效果
    //    [rectanglePath moveToPoint:CGPointMake(185, 177)];
    //    [rectanglePath addLineToPoint:CGPointMake(185, 0)];
    //    [rectanglePath addLineToPoint:CGPointMake(0, 0)];
    //    [rectanglePath addLineToPoint:CGPointMake(0, 177)];
    //    [rectanglePath addLineToPoint:CGPointMake(185, 177)];
    //    [rectanglePath closePath];
    
        CAShapeLayer * rectangle = [CAShapeLayer layer];
        rectangle.frame       = CGRectMake(83, 206, 185, 177);
        rectangle.fillColor   = [UIColor colorWithRed:0.937 green: 0.431 blue:0.268 alpha:1].CGColor;
        rectangle.strokeColor = [UIColor colorWithRed:0.129 green: 0.151 blue:0.404 alpha:1].CGColor;
        rectangle.lineWidth   = 8;
        rectangle.strokeStart = 0.4;
        rectangle.strokeEnd   = 1;
        rectangle.path        = rectanglePath.CGPath;
        [self.view.layer addSublayer:rectangle];
    

    代码大概解释如下:

    1. 用贝塞尔曲线生成一个路径,注意这个路径坐标Y轴是向下的。
    2. 用CAShaperLayer创建一个图层依据刚才的路径,并设置坐标,填充色,边框色,边框的粗细。
    3. 最后添加到layer上。

    但是为什么效果不一样呢?这个就是注意地方:

    strokeStart strokeEnd这两个属性默认strokeStart 是0,strokeEnd是1。这个属性的效果和贝塞尔曲线生成开始的点的位置有关, 方向是逆时针方向。也就是你自己用铅笔画一个矩形的正笔画和倒笔画,同样都是生成矩形,但是效果却不一样。
    

    具体做一个动画来解释

        UIBezierPath *rectanglePath = [UIBezierPath bezierPath];
        
        //    [rectanglePath moveToPoint:CGPointMake(0, 177)];
        //    [rectanglePath addLineToPoint:CGPointMake(185, 177)];
        //    [rectanglePath addLineToPoint:CGPointMake(185, 0)];
        //    [rectanglePath addLineToPoint:CGPointMake(0, 0)];
        //    [rectanglePath addLineToPoint:CGPointMake(0, 177)];
        //    [rectanglePath closePath];
        
        [rectanglePath moveToPoint:CGPointMake(185, 177)];
        [rectanglePath addLineToPoint:CGPointMake(185, 0)];
        [rectanglePath addLineToPoint:CGPointMake(0, 0)];
        [rectanglePath addLineToPoint:CGPointMake(0, 177)];
        [rectanglePath addLineToPoint:CGPointMake(185, 177)];
        [rectanglePath closePath];
        
        CAShapeLayer * rectangle = [CAShapeLayer layer];
        rectangle.frame       = CGRectMake(83, 206, 185, 177);
        rectangle.fillColor   = [UIColor colorWithRed:0.937 green: 0.431 blue:0.268 alpha:1].CGColor;
        rectangle.strokeColor = [UIColor colorWithRed:0.129 green: 0.151 blue:0.404 alpha:1].CGColor;
        rectangle.lineWidth   = 8;
        rectangle.strokeStart = 0;
        rectangle.strokeEnd   = 1;
        rectangle.path        = rectanglePath.CGPath;
        [self.view.layer addSublayer:rectangle];
        
        //做动画
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        
        animation.fromValue = [NSNumber numberWithFloat:0];
        animation.toValue = [NSNumber numberWithFloat:1];
        animation.duration = 1.5;
        
        animation.fillMode = kCAFillModeForwards;
        animation.removedOnCompletion = false;
        
        [rectangle addAnimation:animation forKey:@"drawLineAnimation"];
    

    在图层上加了一个动画描述了路径的生成过程,下面看效果图对比贝塞尔曲线点位置不同影响的结果。

    相关文章

      网友评论

        本文标题:iOS CoreAnimation教程 第二篇

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