CALayer

CAGradientLayer 渐变色遮罩
CALayer_第1张图片
CAGradientLayer.png
  • 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 复制图层
CALayer_第2张图片
Replicator.png
  • 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 粒子发生器
CALayer_第3张图片
Emitter.png
  • 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方法;

  • CAEmitterLayer/CAGradientLayer/CAReplicatorLayer

  • CAReplicatorLayer炫酷动画

  • Core Animation简介

  • CAReplicatorLayer

  • 关于CAShapeLayer的一些实用案例和技巧

你可能感兴趣的:(CALayer)