美文网首页CoreAnimation
CoreAnimation其他图层的使用

CoreAnimation其他图层的使用

作者: MonKey_Money | 来源:发表于2020-07-27 15:45 被阅读0次

    CAShapeLayer

    CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸 如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。当然,你也可以用Core Graphics直接向原 始的 CALayer的内容中绘制一个路径,使用CAShapeLayer有以下一些优点
    1.渲染快速:CAShapeLayer是使用硬件加速,绘制同一图形会比用Core Graphics快很多.
    2.高效使用内存:一个CAShapeLayer不需要像普通CALayer一样创建一个寄 宿图形,所以无论有多大,都不会占用太多的内存。
    3.不会被图层边界剪裁掉:一个CAShapeLayer 可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通 一样被剪裁掉。
    4.不会出现像素化:当你给 CAShapeLayer 做3D变换时,它不像一个有寄宿图 的普通图层一样变得像素化。
    示例:

      CALayer *layer = [CALayer layer];
        layer.frame = CGRectMake(80, 50, 100, 100);
        layer.contents = (__bridge id)[UIImage imageNamed:@"huhu"].CGImage;
        [self.view.layer addSublayer:layer];
        CATransform3D  transform3D = CATransform3DIdentity;
        layer.transform = CATransform3DRotate(transform3D, M_PI, 0, 1, 0);
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(20, 20)];
        CAShapeLayer *shapeLayer =[CAShapeLayer layer];
        shapeLayer.path = path.CGPath;
        layer.mask = shapeLayer;
    
    image.png

    可以通过UIBezierPath来绘制矢量图形,

    CATextLayer

    UIKit显示文本的是UILabel,其内部实现是Core Graphics,在iOS 6及之前版本,UILabel其实是通过WebKit来实现绘制的,这样就造成了当有很多文 字的时候就会有极大的性能压力。CATextLayer是使用了CoreText,并且渲染非常快。

        CATextLayer *textLayer = [CATextLayer layer];
        textLayer.frame = CGRectMake(30, 30, 200, 200);
        [self.view.layer addSublayer:textLayer];
        UIFont *font = [UIFont systemFontOfSize:15];
        CFStringRef fontName = (__bridge CFStringRef)font.fontName;
        textLayer.foregroundColor = [UIColor grayColor].CGColor;
        CFTypeRef fontRef =CGFontCreateWithFontName(fontName);
        textLayer.font = fontRef;
        textLayer.fontSize = font.pointSize;
        textLayer.wrapped = YES;
        textLayer.string = @"同样,也要比 UILabel 渲染得快得多。很少有人知道在iOS 6及之 前的版本,   其实是通过WebKit来实现绘制的,这样就造成了当有很多文 字的时候就会有极大的性能压力。而 CATextLayer 使用了Core text,并且渲染得 非常快。";
        CFRelease(fontRef);
        textLayer.contentsScale = [UIScreen mainScreen].scale;
    
    image.png

    CATransformLayer

    最具说明的使用就是完成立方体,请参考

    CAGradientLayer

    CAGradientLayer是用来生成两种或更多颜色平滑渐变的。用Core Graphics复 制一个并将内容绘制到一个普通图层的寄宿图也是有可能的,但是 的真正好处在于绘制使用了硬件加速。

    基础渐变

      CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.frame = CGRectMake(20, 50, 100, 100);
        gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor blueColor].CGColor];
        gradientLayer.startPoint = CGPointMake(0, 0);
        gradientLayer.endPoint = CGPointMake(1, 1);
        [self.view.layer addSublayer:gradientLayer];
    
    image.png

    colors属性是数组,但是里面的对象也是需要转化成CGColor的对象。

    多重渐变

      CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.frame = CGRectMake(20, 50, 100, 100);
        gradientLayer.colors = @[
            (__bridge id)[UIColor redColor].CGColor,
            (__bridge id)[UIColor blueColor].CGColor,
            (__bridge id)[UIColor greenColor].CGColor,
    
        ];
        gradientLayer.locations = @[
          [NSNumber numberWithFloat:0],
          [NSNumber numberWithFloat:0.5],
          [NSNumber numberWithFloat:1.0],
            
        ];
        gradientLayer.startPoint = CGPointMake(0, 0);
        gradientLayer.endPoint = CGPointMake(1, 0);
        [self.view.layer addSublayer:gradientLayer];
    
    image.png

    locations数组并不是强制要求的,但是如果你给它赋值了就一定要确
    保 locations的数组大小和 colors 数组大小一定要相同,否则你将会得到一个 空白的渐变。

    CAReplicatorLayer

    CAReplicatorLayer的目的是为了高效生成许多相似的图层。它会绘制一个或多 个图层的子图层,并在每个复制体上应用不同的变换。

    CAReplicatorLayer*replicatorLayer=[CAReplicatorLayer layer];
       replicatorLayer.frame = self.view.bounds;
       replicatorLayer.instanceCount = 5;
       replicatorLayer.instanceGreenOffset = -0.1;
       replicatorLayer.instanceBlueOffset = -0.1;
       CATransform3D transform3d = CATransform3DIdentity;
       transform3d = CATransform3DRotate(transform3d, M_PI/8.,0, 0, 1);
       replicatorLayer.instanceTransform = transform3d;
       [self.view.layer addSublayer:replicatorLayer];
       
       CALayer *layer = [CALayer layer];
       layer.frame = CGRectMake(0,200, 50, 50);
       layer.backgroundColor = [UIColor whiteColor].CGColor;
       [replicatorLayer addSublayer:layer];
    
    image.png

    instanceTransform中的旋转是以replicatorLayer的锚点为中心旋转的,如果再平移参考的是物体坐标系。

    实现反射

      CAReplicatorLayer*replicatorLayer=[CAReplicatorLayer layer];
        replicatorLayer.frame = self.view.bounds;
        replicatorLayer.instanceCount = 2;
       replicatorLayer.instanceAlphaOffset = -0.6;
        [self.view.layer addSublayer:replicatorLayer];
        
        CALayer *layer = [CALayer layer];
        layer.frame = CGRectMake(100,self.view.bounds.size.height/2-25, 50, 50);
        layer.contents =(__bridge id) [UIImage imageNamed:@"huhu"].CGImage;
        [replicatorLayer addSublayer:layer];
        
        CATransform3D transform3d = CATransform3DIdentity;
         transform3d = CATransform3DTranslate(transform3d, 0, 53, 0);
        transform3d = CATransform3DScale(transform3d, 1, -1, 0);
         replicatorLayer.instanceTransform = transform3d;
    
    image.png

    CAScrollLayer

    CAScrollLayer比较简单,看官方文档

    CATiledLayer

    处理大图片

    相关文章

      网友评论

        本文标题:CoreAnimation其他图层的使用

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