CoreAnimation其他图层的使用
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
处理大图片