iOS动画之-CAEmitterLayer粒子动画

粒子动画

粒子动画主要是通过CAEmitterLayerCAEmitterCell来完成。使用粒子动画可以实现很多的特效,比如红包雨,点击、星星等。

CAEmitterLayer

CAEmitterLayerCALayer的子类,该类用于实现粒子发射器。通过它来发射粒子来展现动画。CAEmitterLayer常用属性如下所示:

  • emitterCells

粒子数组,用于添加CAEmitterLayer对象。

  • birthRate

用于设置粒子产生的系数,默认为1,如果设置为0可以停止发射粒子,用于控制动画的暂停。

  • lifetime

粒子的生命周期,用于控制粒子在屏幕上显示的时间。

  • emitterPosition

粒子发射的位置,默认为原点坐标,还有个emitterZPosition属性,主要是跟三维的位置相关,先不做具体的说明。

  • emitterSize

用于设置发射器的尺寸。

  • emitterShape

表示粒子从什么形状发射出来。主要包括以下几种枚举类型:

kCAEmitterLayerPoint
kCAEmitterLayerLine
kCAEmitterLayerRectangle
kCAEmitterLayerCuboid
kCAEmitterLayerCircle
kCAEmitterLayerSphere
  • emitterMode

发射模式,用于决定粒子具体的形状。主要包括以下几种枚举类型:

kCAEmitterLayerPoints
kCAEmitterLayerOutline
kCAEmitterLayerSurface
kCAEmitterLayerVolume
  • velocity

用于设置粒子的运行速度的系数。

  • scale

用于设置缩放比例。

  • spin

用于设置粒子的自旋转速度系数。

  • speed

用于设置粒子的随机数发射器。

CAEmitterCell

**CAEmitterCell**是一个粒子单元,是通过CAEmitterLayer进行发射的一个粒子单元,CAEmitterLayer也可以发射粒子。常用的属性如下所示:

  • name

用于设置粒子的名称。

  • enabled

用于设置粒子是否显示。

  • birthRate

用于设置粒子的产生率。

  • lifetime

粒子的生命周期。

  • lifetimeRange

粒子生命周期的范围。

  • emissionRange

粒子发射角度的范围。

  • emissionLatitude

设置粒子的纬度角,相对于发射形状的自然方位角,用于控制不同的方向。

  • emissionLongitude

设置粒子的经度角,相对于发射形状的自然方位角,用于控制不同的方向。

  • velocity

用于设置粒子的运行速度的系数。

  • velocityRange

用于设置粒子的运行速度系数的范围。

  • scale

用于设置缩放比例。

  • scaleRange

用于设置缩放比例范围。

  • scaleSpeed

用于设置缩放比例的速度。

  • spin

用于设置粒子的自旋转速度系数。

  • spinRange

用于设置粒子的自旋转速度系数范围。

  • contents

用于设置粒子的内容,默认为CGImageRef的对象。

  • emitterCells

粒子里面创建的粒子。

  • color

用于设置粒子的颜色,redRangegreenRangeblueRangealphaRange:这些是对应的color的RGBA的取值范围,取值范围为01。`redSpeed`、`greenSpeed`、`blueSpeed`、`alphaSpeed`:这些是对应的是粒子的RGBA的变化速度,取值范围为01。表示每秒钟的RGBA的变化率。

下面实现一个点赞的动画,效果如下所示:

效果图
#import "MLLiveLikeViewController.h"

@interface MLLiveLikeViewController ()
@property (nonatomic,strong) UIButton *likeBtn;
@property (nonatomic,strong) NSMutableArray *boomCells;
@property (nonatomic,strong) CAEmitterLayer *emitterLayer;
@end

@implementation MLLiveLikeViewController
[个人博客](http://gzcopyright.cn/)

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.likeBtn];
}


- (UIButton *)likeBtn{
    if(!_likeBtn){
        _likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        CGRect frame = self.view.frame;
        _likeBtn.frame = CGRectMake(frame.size.width / 2 - 30, frame.size.height / 2 - 10, 60, 30);
        [_likeBtn setTitle:@"点赞" forState:UIControlStateNormal];
        [_likeBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [_likeBtn addTarget:self action:@selector(likeAction) forControlEvents:UIControlEventTouchUpInside];
    }
    return _likeBtn;
}


-(void)likeAction{
    [self addCAEmitteAnimation];
}
-(void)addCAEmitteAnimation
{
    CAEmitterLayer *emitter = [CAEmitterLayer layer];
    emitter.frame = self.likeBtn.frame;
    emitter.lifetime = 10;
    [self.view.layer addSublayer:emitter];
    
    emitter.emitterShape = kCAEmitterLayerCircle;
    emitter.emitterMode = kCAEmitterLayerCircle;
    emitter.emitterPosition = CGPointMake(emitter.frame.size.width/2, emitter.frame.size.height/2);
    
    CAEmitterCell *cell = [[CAEmitterCell alloc] init];
    cell.contents = (__bridge id)[UIImage imageNamed:@"heart2"].CGImage;
    //产生粒子的个数
    cell.birthRate = 15;
    //粒子的生命周期
    cell.lifetime = 0.5;
    cell.lifetimeRange = 1;
    //粒子透明度变化
    cell.alphaSpeed = -0.4;
    //粒子速度
    cell.velocity = 100;
    cell.velocityRange = 1000;
    //粒子发射方向
    cell.emissionRange = M_PI *2.0;
    //旋转
    cell.spin = 0.1;
    cell.spin = 1;
    
    emitter.emitterCells = @[cell];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        emitter.birthRate = 0;//停止发射
    });
}

具体的代码可以在demo中查看

你可能感兴趣的:(iOS动画之-CAEmitterLayer粒子动画)