iOS 核心动画 - 专用图层
2016-03-31 本文已影响87人
NSLogHome
CAShapeLayer
优点
- 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。
- 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。
- 不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。
- 不会出现像素化。
用处
一般用 UIBezierPath 来配合做矢量图
例: 创建一个即刻 下拉动画中 J
UIBezierPath *path = [UIBezierPath new];
[path moveToPoint:CGPointMake(100, 100)];
[path addLineToPoint:CGPointMake(100, 150)];
[path addQuadCurveToPoint:CGPointMake(70, 170) controlPoint:CGPointMake(100, 170)];
[path addLineToPoint:CGPointMake(70, 180)];
[path addQuadCurveToPoint:CGPointMake(110, 150) controlPoint:CGPointMake(110, 180)];
[path addLineToPoint:CGPointMake(110, 100)];
[path closePath];
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
shapeLayer.fillColor = [UIColor lightGrayColor].CGColor;
shapeLayer.strokeColor = [UIColor clearColor].CGColor;
shapeLayer.path = path.CGPath;
CATextLayer
优点
1.它以图层的形式包含了UILabel几乎所有的绘制特性,并且额外提供了一些新的特性
2.CATextLayer也要比UILabel渲染得快得多,并且 CATextLayer 使用Core text
要点
- 注意 contentsScale, 得手动地设置CATextLayer的contentsScale属性
textLayer.contentsScale = [UIScreen mainScreen].scale;
- font属性不是一个UIFont类型,而是一个CFTypeRef类型,意味着可以使用CTFontRef类型(Core Text字体)
- string属性并不是NSString类型,而是id类型。既可以用NSString也可以用NSAttributedString来指定文本;
CATransformLayer(只是粗略的读了读。。。ORZ)
优点
不平面化它的子图层,所以它能够用于构造一个层级的3D结构;
CAGradientLayer
用处
主要用来做渐变效果;
用法
- startPoint和endPoint属性,他们决定了渐变的方向。这两个参数是以单位坐标系进行的定义,所以左上角坐标是{0, 0},右下角坐标是{1, 1};
- 基础渐变
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.containerView.bounds;
[view.layer addSublayer:gradientLayer];
//设置 colors(两种)(CGColorRef 类型)
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor blueColor].CGColor];
//设置起始和结束
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(1, 1);
- 多重渐变
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.containerView.bounds;
[view.layer addSublayer:gradientLayer];
//设置多个color
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id) [UIColor yellowColor].CGColor, (__bridge id)[UIColor greenColor].CGColor];
// 在colors > 2 的时候需要设置,相当于告诉系统分界点。。 必须于 colors.count 相等
gradientLayer.locations = @[@0.0, @0.25, @0.5];
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(1, 1);
CAReplicatorLayer
用处
- 重复图层
- 反射: 创建类似水中投影的效果
CAReplicatorLayer *layer = (CAReplicatorLayer *)self.layer;
layer.instanceCount = 2;
[view addSublayer:layer];
//将复制图层放置在正下方
CATransform3D transform = CATransform3DIdentity;
CGFloat verticalOffset = view.bounds.size.height + 2;
transform = CATransform3DTranslate(transform, 0, verticalOffset, 0);
transform = CATransform3DScale(transform, 1, -1, 0);
layer.instanceTransform = transform;
// 设置透明度
layer.instanceAlphaOffset = -0.6;
- 实现声波和涟漪效果 具体看 https://github.com/94haox/DWRipplesLayer
CAScrollLayer (于UIScrollView相似)
注意
不负责将触摸事件转换为滑动事件,既不渲染滚动条,也不实现任何iOS指定行为例如滑动反弹;
CATiledLayer
用处
将一个大图裁切成许多小的图片,减少内存的消耗;(主要和CAScrollLayer搭配)
CAEmitterLayer(只是粗略的读了读。。。ORZ)
用处
1.粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。