美文网首页
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