iOS 核心动画

CALayer

2016-11-08  本文已影响96人  DDY
CAGradientLayer 渐变色遮罩
CAGradientLayer.png
// 添加渐变层
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 复制图层
Replicator.png

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 粒子发生器
Emitter.png
    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
CATiledLayer
CATransformLayer

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效果。

上一篇 下一篇

猜你喜欢

热点阅读