CoreAnimation

CoreAnimation其他图层的使用

2020-07-27  本文已影响0人  MonKey_Money

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

处理大图片

上一篇下一篇

猜你喜欢

热点阅读