美文网首页iOS开发之笔记摘录
CALayer的常用子类之笔记摘录

CALayer的常用子类之笔记摘录

作者: 平安喜乐698 | 来源:发表于2020-03-17 17:57 被阅读0次
    目录
      1. CAReplicatorLayer 复制动画
      2. CAShapeLayer 路径动画
    
    

    从个人笔记中摘录而来。时间间隔长了点,可能有部分失误。谨作为个人网上笔记。
    不适合他人阅读。

    前言

    
    

    1. CAReplicatorLayer 复制动画

    CAReplicatorLayer:一个用于动画的Layer容器,存放若干份复制的子Layer。

    1. 属性

    配置子Layer的:复制个数、延迟时间、形变、颜色、透明度等

    CAReplicatorLayer : CALayer  
    
        // 是否开启景深
        @property BOOL preservesDepth;
    
        // 要拷贝的个数(默认为1)
        @property NSInteger instanceCount;
    
        // 间隔时间(延迟时间)
        @property CFTimeInterval instanceDelay;
    
        // 背景色,如果设置了backgroundColor则此属性失效
        @property(nullable) CGColorRef instanceColor;
    
        // 形变
        @property CATransform3D instanceTransform;
    
        // 颜色偏移(为负则递减)
        @property float instanceRedOffset;
        @property float instanceGreenOffset;
        @property float instanceBlueOffset;
    
        // 透明度偏移(为负则递减)
        @property float instanceAlphaOffset;
    
    1. 使用
    运行效果

    第一步:创建CAReplicatorLayer对象(负责配置)

        CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
        [replicatorLayer setInstanceCount:8];
        [replicatorLayer setInstanceTransform:CATransform3DMakeTranslation(50, 0, 0)];
        [replicatorLayer setInstanceDelay:0.15];
        [replicatorLayer setInstanceColor:[UIColor blueColor].CGColor];
        [replicatorLayer setInstanceAlphaOffset:-0.1];
    

    第二步:创建一个图层对象(子Layer)

        CALayer *layer=[CALayer layer]; // 这里可以是某个View的layer
        [layer setBounds:CGRectMake(0, 0, 20, 100)];    // 大小
        [layer setBackgroundColor:[UIColor greenColor].CGColor];    // 会和replicatorLayer的InstanceColor混合
        [layer setPosition:CGPointMake(50, 300)];   // 第一个子layer的位置
        [layer setAnchorPoint:CGPointMake(0, 1)];   // 锚点
    

    第三步:创建一个基本动画(子Layer设置Animation)

        CABasicAnimation *scaleAnimation=[CABasicAnimation animation];
        [scaleAnimation setRepeatCount:MAXFLOAT];
        [scaleAnimation setKeyPath:@"transform.scale.y"];
        [scaleAnimation setToValue:@(0.1)];
        [scaleAnimation setDuration:0.5];
        [scaleAnimation setAutoreverses:true];  // 形变完成后动画返回原状态
        [layer addAnimation:scaleAnimation forKey:@"hello"];
    

    第四步:子Layer添加到CAReplicatorLayer中

        [replicatorLayer addSublayer:layer];
        [self.view.layer addSublayer:replicatorLayer];
    

    2. CAShapeLayer 路径动画

    需要配合贝塞尔曲线(提供路径/形状)

    1. 属性
    CAShapeLayer : CALayer
    
         // 路径(用于渲染)(必填)
         @property(nullable) CGPathRef path;
    
         // 填充色(默认:黑色)
         @property(nullable) CGColorRef fillColor;
         // kCAFillRuleNonZero(默认)、kCAFillRuleEvenOdd
         @property(copy) CAShapeLayerFillRule fillRule;
    
         // 边框色(默认:nil)
         @property(nullable) CGColorRef strokeColor;
         // 边框线宽(默认:1)
         @property CGFloat lineWidth;
         // 线两端(kCALineCapButt(默认)、kCALineCapRound、kCALineCapSquare)
         @property(copy) CAShapeLayerLineCap lineCap;
         // 线连接处(kCALineJoinMiter(默认)、kCALineJoinRound、kCALineJoinBevel)
         @property(copy) CAShapeLayerLineJoin lineJoin;
         //  边框线的起始、结束位置[0,1]
         @property CGFloat strokeStart; // 默认:0
         @property CGFloat strokeEnd;   // 默认:1
         
         // 默认:nil
         @property(nullable, copy) NSArray<NSNumber *> *lineDashPattern;
         // 默认:0
         @property CGFloat lineDashPhase;
         // 斜接,默认:10
         @property CGFloat miterLimit;
    
    1. 使用

    第一步:创建UIBezierPath

        CGPoint startPoint=CGPointMake(0, 300);
        CGPoint endPoint=CGPointMake(300, 300);
        CGPoint controlPoint1=CGPointMake(50, 40);
        CGPoint controlPoint2=CGPointMake(100, 500);
        UIBezierPath *path=[UIBezierPath new];
        [path moveToPoint:startPoint];
        [path addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];
        [path addLineToPoint:controlPoint2];
    

    第二步:创建CAShapeLayer(设置path,并添加到父Layer中)

        CAShapeLayer *progressLineLayer=[CAShapeLayer layer];
        [progressLineLayer setPath:path.CGPath];
        [progressLineLayer setStrokeColor:[UIColor orangeColor].CGColor];
        [progressLineLayer setFillColor:[UIColor redColor].CGColor];
        [progressLineLayer setLineWidth:5.0];
        [progressLineLayer setLineCap:kCALineCapRound];     //
        [progressLineLayer setLineJoin:kCALineJoinRound];   //
        [progressLineLayer setStrokeStart:0.2];
        [self.view.layer addSublayer:progressLineLayer];
    
    运行效果

    相关文章

      网友评论

        本文标题:CALayer的常用子类之笔记摘录

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