美文网首页
iOS- CoreAnimation之CALayer

iOS- CoreAnimation之CALayer

作者: 流云_henry | 来源:发表于2020-07-10 11:09 被阅读0次

    CoreAnimation框架时基于OpenGL与CoreGraphics图像处理框架的一个跨平台的动画框架.简单来说,它帮组我们将图像读取成位图,通过硬件处理,实现动画效果.
    在CoreAnimation中,大部分动画都是通过Layer层来实现的,通过CALayer,我们可以组织复杂的层级结构。
    在CoreAnimation中,大多数的动画效果是添加在图层属性的变化上的。例如改变图层的位置、大小、颜色、圆角半径等等。Layer层并不决定视图的展现,它只是存储了视图的几何属性状态。

    1、Layer的锚点

    锚点决定了图层的绘制位置以及在动画展示时其参照的点 ,锚点的取值范围为0~1,锚点有两个地方在应用中会有很大点影响。

    1.1、Layer层的position参照点始终和锚点重合

    通过position决定了Layer所在的位置,在Layer中,虽然也有frame这样的属性,但我们很少用,一般我们会使用bounds和position确定Layer层的大小和位置。

    1.2、锚点决定进行动作的参照点

    例如一个选择动作,锚点决定了层旋转的中心点,对于放大或缩小动作,锚点决定了放大或缩小参照的中心点。


    image.png

    上面两个矩形的frame和bounds都是一样的,第一个矩形的锚点位置为(0.5,0.5),第二个为(0,0),因此两个矩形的position点是不一样的,第一个是(100,100),第二个是(40,60)。锚点对视图动作的影响如下图:


    image.png
    锚点的不同直接影响了动作产生的参照点。通过CALayer的如下属性,我们可以设置锚点。注意x,y的取值范围都是0~1,代表所占宽度和高度的比例:
    @property CGPoint anchorPoint;
    

    2、深入理解CALayer

    在每个UIView的对象中都有一个Layer属性,来负责View中有关图形绘制的相关操作。

    2.1、CAGradientLayer

    CAGradientLayer是用于色彩梯度展示的Layer图层,我们可以通过它很轻松的创建出有过度效果的色彩图。

    - (void)creatGradientLayer {
        CAGradientLayer *layer = [CAGradientLayer layer];
        //颜色数组,设置我们需要的过渡颜色,必须是CGColor对象
        layer.colors = @[(id)UIColor.redColor.CGColor,(id)UIColor.blueColor.CGColor,(id)UIColor.yellowColor.CGColor,(id)UIColor.greenColor.CGColor];
        //过渡颜色过渡的位置
        layer.locations = @[@0.1,@0.5,@0.8,@1];
        layer.bounds = CGRectMake(0, 0, 200, 200);
        layer.position = CGPointMake(200, 300);
        //渲染颜色的起点和终点,取值为0~1,默认起点为(0.5,0),终点为(0.5,1),颜色的过渡范围就是沿y轴从上向下
        layer.startPoint = CGPointMake(0, 0);
        layer.endPoint = CGPointMake(1, 1);
        [self.view.layer addSublayer:layer];
    }
    
    

    效果图如下:


    image.png
    2.2、CAReplocatorLayer

    CAReplocatorLayer是拷贝视图容器,我们可以通过它对其中的子Layer进行拷贝,并进行一些差异化处理。

    - (void)creatCAReplocatorLayer {
           // 1.创建一个复制图层对象,设置复制层的属性
            CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
            
            // 1.1.设置复制图层中子层总数:这里包含原始层
            replicatorLayer.instanceCount = 8;
            // 1.2.设置复制子层偏移量,不包含原始层,这里是相对于原始层的x轴的偏移量
            replicatorLayer.instanceTransform = CATransform3DMakeTranslation(45, 0, 0);
            // 1.3.设置复制层的动画延迟事件
            replicatorLayer.instanceDelay = 0.1;
            // 1.4.设置复制层的背景色,如果原始层设置了背景色,这里设置就失去效果
            replicatorLayer.instanceColor = [UIColor greenColor].CGColor;
            // 1.5.设置复制层颜色的偏移量
            replicatorLayer.instanceGreenOffset = -0.1;
           
            // 2.创建一个图层对象  单条柱形 (原始层)
            CALayer *layer = [CALayer layer];
            // 2.1.设置layer对象的位置
            layer.position = CGPointMake(15, self.view.bounds.size.height);
            // 2.2.设置layer对象的锚点
            layer.anchorPoint = CGPointMake(0, 1);
            // 2.3.设置layer对象的位置大小
            layer.bounds = CGRectMake(0, 0, 30, 150);
            // 2.5.设置layer对象的颜色
            layer.backgroundColor = [UIColor whiteColor].CGColor;
            
            // 3.创建一个基本动画
            CABasicAnimation *basicAnimation = [CABasicAnimation animation];
            // 3.1.设置动画的属性
            basicAnimation.keyPath = @"transform.scale.y";
            // 3.2.设置动画的属性值
            basicAnimation.toValue = @0.1;
            // 3.3.设置动画的重复次数
            basicAnimation.repeatCount = MAXFLOAT;
            // 3.4.设置动画的执行时间
            basicAnimation.duration = 0.5;
            // 3.5.设置动画反转
            basicAnimation.autoreverses = YES;
            
            // 4.将动画添加到layer层上
            [layer addAnimation:basicAnimation forKey:nil];
            
            // 5.将layer层添加到复制层上
            [replicatorLayer addSublayer:layer];
            
            // 6.将复制层添加到view视图层上
            [self.view.layer addSublayer:replicatorLayer];
       
    }
    

    这样一个简单的音乐波动控件就ok了,效果如下图:


    image.png
    2.3、CAShapeLayer

    CAShapeLayer是图形的Layer层,我们可以自定义这个层的形状。

    - (void)creatCAShapeLayer {
       //创建个Layer的图形层
       CAShapeLayer *layer = [CAShapeLayer layer];
       layer.position = CGPointMake(0, 0);
       //创建一个边界路径(绘制个三角形)
       CGMutablePathRef path = CGPathCreateMutable();
       CGPathMoveToPoint(path, 0, 100, 100);
       CGPathAddLineToPoint(path, 0, 300, 100);
       CGPathAddLineToPoint(path, 0, 200, 200);
       CGPathAddLineToPoint(path, 0, 100, 100);
       layer.path = path;
       //填充颜色
       layer.fillColor = UIColor.redColor.CGColor;
       //填充规则 NonZeor-非零填充,EvenOdd-奇偶填充,
       layer.fillRule = kCAFillRuleEvenOdd;
       //设置线条颜色
       layer.strokeColor = UIColor.blueColor.CGColor;
       //设置线条的起点和终点在0~1间
       layer.strokeStart = 0;
       layer.strokeEnd = 0.8;
       layer.lineWidth = 5;
       //设置两条线段相交时锐角斜面的长度
       layer.miterLimit = 1;
       //设置线条的收尾外观 Butt-五星壮,Round-圆形,square-方形
       layer.lineCap = kCALineCapRound;
       //设置线条的连接方式 Miter-棱角,Round-平滑,Bevel-折线
       layer.lineJoin = kCALineJoinRound;
       [self.view.layer addSublayer:layer];
    }
    

    效果图如下:


    image.png
    2.4、CATextLayer

    CATextLayer可以用来进行文本的绘制,方法比较简单这里就不在详细介绍了

    相关文章

      网友评论

          本文标题:iOS- CoreAnimation之CALayer

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