CAGradientLayer 渐变色遮罩
- CAGradientLayer用来绘制渐变色,指定几个颜色值、渐变结束位置,就能在layer中绘制出渐变效果。
// 添加渐变层
CAGradientLayer * shadow = [CAGradientLayer layer];
shadow.frame = imgV.bounds;
shadow.opacity = .4f;
[imgV.layer addSublayer:shadow];
// [imgV.layer insertSublayer:shadow atIndex:0];
// 设置渐变的方向
shadow.startPoint = CGPointMake(0, 0);
shadow.endPoint = CGPointMake(1, 1);
// 设置渐变的颜色
shadow.colors = @[(__bridge id)[UIColor blueColor].CGColor,
(__bridge id)[UIColor redColor].CGColor,
(__bridge id)[UIColor greenColor].CGColor];
// 设置渐变分割点
shadow.locations = @[@(0.15f), @0.5f, @0.85];
CAReplicatorLayer 复制图层
- CAReplicatorLayer创建layer和sublayer的多个副本,副本改变颜色、形状、透明度
ReplicatorView.m
#import "ReplicatorView.h"
@implementation ReplicatorView
// 必须重写,否则-[CALayer setInstanceCount:]: unrecognized selector sent to instance
+ (Class)layerClass {
return [CAReplicatorLayer class];
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
imageView.image = [UIImage imageNamed:@"GMJ"];
[imageView setContentMode:UIViewContentModeScaleToFill];
[self addSubview:imageView];
}
return self;
}
@end
运用
ReplicatorView *testV = [[ReplicatorView alloc] initWithFrame:CGRectMake(DDYSCREENW/4.0, DDYSCREENW/2.0+64, DDYSCREENW/2.0, DDYSCREENW/2.0)];
[self.view addSubview:testV];
CAReplicatorLayer *rlayer = (CAReplicatorLayer *)testV.layer;
rlayer.instanceCount = 2;
CATransform3D transform = CATransform3DMakeTranslation(0, testV.ddy_h+5, 0);
transform = CATransform3DRotate(transform, M_PI, 1, 0, 0);
transform = CATransform3DScale(transform, 1, 0.8, 1);
rlayer.instanceTransform = transform;
rlayer.instanceAlphaOffset = -0.1;
rlayer.instanceRedOffset = -0.1;
rlayer.instanceGreenOffset = -0.1;
rlayer.instanceBlueOffset = -0.1;
CAEmitterLayer 粒子发生器
CAEmitterLayer用来实现基于Core Animation的粒子发生器系统,每个粒子都是一个CAEmitterCell的实例,粒子绘制在背景色与border之上。在属性中,可以指定Layer中的CAEmitterCell数组,每个cell定义了自己的一组属性,如速度、粒子发生率、旋转、缩放或者内容等。每个粒子也都有一个emitterCells属性,可以做为一个粒子发生器来运作。Layer还可以设置发生器位置、发生器形状、发射单元的位置等等。
-
emitterMode 发送的样式:
- kCAEmitterLayerPoints //点(默认)
- kCAEmitterLayerOutline//线
- kCAEmitterLayerSurfack//面
- kCAEmitterLayerVolume//团
-
renderMode 粒子渲染方式:
- kCAEmitterLayerOldestFirst 最后的出生的粒子 在第一个
- kCAEmitterLayerOldestLast 最后的出生的粒子 在最后面
- kCAEmitterLayerBackToFront 把后面的 放到上面
- kCAEmitterLayerAdditive 叠加
-
emitterShape 发送形状的样式:
- kCAEmitterLayerPoint 点
- kCAEmitterLayerLine 线
- kCAEmitterLayerRectangle 矩形
- kCAEmitterLayerCuboid 立方体
- kCAEmitterLayerCircle 曲线
- kCAEmitterLayerSphere 圆形
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.frame = CGRectMake(0, 0, DDYSCREENW, DDYSCREENH);
[self.view.layer addSublayer:emitter];
emitter.emitterPosition = CGPointMake(DDYSCREENW/2.0, DDYSCREENH*5/6.0);
// emitterMode 发送的样式,默认是点
emitter.emitterMode = kCAEmitterLayerPoints;
// renderMode 粒子渲染方式: 叠加增强
emitter.renderMode = kCAEmitterLayerAdditive;
// 每秒产生4个
emitter.birthRate = 4;
CAEmitterCell *rocket = [CAEmitterCell emitterCell];
rocket.contents = (__bridge id)[UIImage imageWithColor:DDYRandomColor size:CGSizeMake(5, 5)].CGImage;
// 经纬度,经度角:x-y轴平面上与x轴夹角,纬度角:x-z轴平面上与x轴夹角
rocket.emissionLongitude = -M_PI / 2;
rocket.emissionLatitude = 0;
// 粒子存活时间:5秒后消失
rocket.lifetime = 5.0;
// birthRate:100/s,与CAEmitterLayer的birtuRate相乘,最终400/s
rocket.birthRate = 100;
// velcity指定了初速度
rocket.velocity = 400;
// velcityRange设置初速度在300到500之间浮动
rocket.velocityRange = 100;
// yAcceleration指定了沿y轴250的加速度,用于给粒子减速
rocket.yAcceleration = 250;
// emissionRange 围绕着y轴负方向,建立了一个圆锥形,粒子范围内打出
rocket.emissionRange = M_PI / 4;
// color设置了粒子的颜色,并设置了每个色值的浮动范围,用于生成所有颜色的烟火
rocket.color = CGColorCreateCopy(DDYColor(255.0, 120.0, 120.0, 0.5).CGColor);
rocket.redRange = 0.5;
rocket.greenRange = 0.5;
rocket.blueRange = 0.5;
rocket.alphaSpeed = -0.2;
// 设置了名称,以后可以再次引用它
[rocket setName:@"rocket"];
emitter.emitterCells = @[rocket];
/*
// 设置基本动画
CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:@"emitterCells.snow.birthRate"];
ani.fromValue = @(20.0);
ani.toValue = @(0.0);
ani.duration = 12.f;
// 设置结束时的值
[snowEmitter setValue:[NSNumber numberWithFloat:0] forKeyPath:@"emitterCells.snow.birthRate"];
// 添加动画
[snowEmitter addAnimation:ani forKey:nil];
*/
CAScrollLayer
- CAScrollLayer提供了和UIScrollView的基本功能。只不过它是layer,只负责显示,不响应用户事件,也不提供滚动条
CATiledLayer
- CATiledLayer提供异步加载图片各部分的功能。layer的drawLayer:inContext:方法会在出现时回调,用来绘制对应部分的内容。可以通过Context的clip bounds和CTM(当前图形上下文的仿射变换,CGContextGetCTM方法)来判断是图片的哪一部分以及大小
CATransformLayer
- CATransformLayer用来创建3D的layer结构,而不是CALayer那样的扁平结构。和普通layer不同的地方有:
1、transform layer只渲染sublayers,那些从CALayer继承下来的属性不起作用,包括:backgroundColor, contents, border style properties, stroke style properties等。
2、2D图片的处理属性也不起作用,包括:filters, backgroundFilters, compositingFilter, mask, masksToBounds以及阴影属性。
3、opacity属性会应用到每个sublayer,transform layer并不作为一个整体来实现半透明效果。
4、在transform layer上不可以调用hitTest:方法,因为它并不存在一个2D的坐标空间来定位所测试的点。
在transform layer上设置sublayerTransform的m34值,定位一个透视点,sublayer上应用z轴位置变换的动画,就可以看到3D效果。
附
错误: -[CALayer setInstanceCount:]: unrecognized selector sent to instance
解决: 必须重写复制的view的+ layerClass方法;