iOS使用核心动画和粒子发射器实现点赞按钮的方法

 更新时间:2016年12月04日 10:58:04   投稿:daisy  
这篇文章主要给大家介绍了iOS如何使用核心动画和粒子发射器实现点赞按钮的方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴,有需要的朋友们下面跟着小编一起来学习学习吧。

首先放上效果图,大家可以看一下

实现的方法如下

一、使用到的类

  1. CAKeyframeAnimation       // 核心动画-关键帧动画
  2. CAEmitterLayer            // 粒子发射器(其实就是一个Layer,其父类是CALayer)
  3. CAEmitterCell             // 粒子
  4. PS:核心动画应该不用多说了;
  5. CAEmitterLayer和CAEmitterCell,其实可以比喻成“炮”和“炮弹”,应该不难理解;

二、直接上部分关键代码 代码中会有详细的注释

2.1 .m中需要拥有的属性

/** weak类型 粒子发射器 */
@property (nonatomic, weak) CAEmitterLayer *emitterLayer;

2.2 initWithFrame: 方法中

- (instancetype)initWithFrame:(CGRect)frame {
 self = [super initWithFrame:frame];
 if (self) {
 // 配置粒子发射器方法
 [self setupEmitter];
 }
 return self;
}

2.3 setSelected: 方法中

- (void)setSelected:(BOOL)selected {
 [super setSelected:selected];
 // 开始关键帧动画
 [self keyframeAnimation];
}

2.4 layoutSubviews 方法中

- (void)layoutSubviews{
 [super layoutSubviews];
 /// 设置粒子发射器的锚点
 _emitterLayer.position = self.imageView.center; 
}

2.5 setupEmitter 方法中( 配置粒子发射器方法 )

- (void)setup {
 // 粒子使用CAEmitterCell初始化
 CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
 // 粒子的名字,在设置喷射个数的时候会用到
 emitterCell.name  = @"emitterCell";
 // 粒子的生命周期和生命周期范围
 emitterCell.lifetime  = 0.7;
 emitterCell.lifetimeRange = 0.3;
 // 粒子的发射速度和速度的范围
 emitterCell.velocity  = 30.00;
 emitterCell.velocityRange = 4.00;
 // 粒子的缩放比例和缩放比例的范围
 emitterCell.scale  = 0.1;
 emitterCell.scaleRange = 0.02;

 // 粒子透明度改变范围
 emitterCell.alphaRange = 0.10;
 // 粒子透明度在生命周期中改变的速度
 emitterCell.alphaSpeed = -1.0;
 // 设置粒子的图片
 emitterCell.contents  = (id)[UIImage imageNamed:@"Sparkle3"].CGImage;

 /// 初始化粒子发射器
 CAEmitterLayer *layer = [CAEmitterLayer layer];
 // 粒子发射器的 名称
 layer.name   = @"emitterLayer";
 // 粒子发射器的 形状(可以想象成打仗时,你需要的使用的炮的形状)
 layer.emitterShape  = kCAEmitterLayerCircle;
 // 粒子发射器 发射的模式
 layer.emitterMode  = kCAEmitterLayerOutline;
 // 粒子发射器 中的粒子 (炮要使用的炮弹)
 layer.emitterCells  = @[emitterCell];
 // 定义粒子细胞是如何被呈现到layer中的
 layer.renderMode  = kCAEmitterLayerOldestFirst;
 // 不要修剪layer的边界
 layer.masksToBounds  = NO;
 // z 轴的相对坐标 设置为-1 可以让粒子发射器layer在self.layer下面
 layer.zPosition  = -1;
 // 添加layer
 [self.layer addSublayer:layer];
 _emitterLayer = layer;
}

注意:这里有一点需要详细解释一下, CAEmitterCell 的属性一般有两个参数:一个平均值和一个“Range”,比如:

// 粒子的生命周期和生命周期范围
 emitterCell.lifetime  = 0.7;
 emitterCell.lifetimeRange = 0.3;

这里苹果的官方文档是这样解释的:

每一个Layer都有它自己的随机数发生器,粒子的属性大部分都被定义为一个平均值和一个范围值,

如粒子的速度,这个属性的值分布的区间为:[ M - R / 2,M + R / 2 ]。

然后 这个公式里面

      M:均值(拿上面代码说就是 emitterCell.lifetime)

      R:范围值(mitterCell.lifetimeRange)

然后我们就可根据公式算出上面我设置的粒子的生命周期的范围是[0.7-0.3/2 , 0.7+0.3/2]

2.6 keyframeAnimation 方法中 (开始关键帧动画)

- (void)animation {
 // 创建关键帧动画 
 CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
 if (self.selected) {
 animation.values = @[@1.5 ,@0.8, @1.0,@1.2,@1.0];
 animation.duration = 0.5;
 // 粒子发射器 发射
 [self startFire];
 }else
 {
 animation.values = @[@0.8, @1.0];
 animation.duration = 0.4;
 }
 // 动画模式
 animation.calculationMode = kCAAnimationCubic;
 [self.imageView.layer addAnimation:animation forKey:@"transform.scale"];
}

这段代码没什么说的,应该很容易理解。

2.7 startFire 方法中 (开炮)

- (void)startFire{
 // 每秒喷射的80个
 [self.emitterLayer setValue:@1000 forKeyPath:@"emitterCells.emitterCell.birthRate"];
 // 开始
 self.emitterLayer.beginTime = CACurrentMediaTime();
 // 执行停止
 [self performSelector:@selector(stopFire) withObject:nil afterDelay:0.1];

}

2.8 stopFire 方法中 (停火)

- (void)stopFire {
 //每秒喷射的个数0个 就意味着关闭了
 [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"]; 
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • iOS中如何引用另一个工程的方法教程

    iOS中如何引用另一个工程的方法教程

    在iOS开发中,引用另一个工程是大家可能会遇到的一个问题,所以这篇文章主要给大家介绍了关于iOS中如何引用另一个工程的相关资料,文中通过图文介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • iOS实现文字转化成彩色文字图片

    iOS实现文字转化成彩色文字图片

    这篇文章主要为大家详细介绍了iOS文字转化成彩色文字图片的实现方法,可以实现不同字体,渐变的效果,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Xcode 10升级导致项目报错的常见问题解决

    Xcode 10升级导致项目报错的常见问题解决

    这篇文章主要给大家介绍了关于Xcode 10升级导致项目报错的常见问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • iOS实现抽屉效果

    iOS实现抽屉效果

    这篇文章主要为大家详细介绍了iOS实现抽屉效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • IOS开发之路--C语言构造类型

    IOS开发之路--C语言构造类型

    在第一节中我们就提到C语言的构造类型,分为:数组、结构体、枚举、共用体,当然前面数组的内容已经说了很多了,这一节将会重点说一下其他三种类型。
    2014-08-08
  • IOS 基础之设置 tableview 的分割线

    IOS 基础之设置 tableview 的分割线

    这篇文章主要介绍了IOS 基础之设置 tableview 的分割线的相关资料,需要的朋友可以参考下
    2017-03-03
  • iOS中json解析出现的null,nil,NSNumber的解决办法

    iOS中json解析出现的null,nil,NSNumber的解决办法

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式,通过本文给大家介绍iOS中json解析出现的null,nil,NSNumber的解决办法,感兴趣的朋友参考下
    2016-01-01
  • iOS为UIView设置阴影效果

    iOS为UIView设置阴影效果

    现在很多的开发者们都会在开发的时候加阴影效果,所以这篇文章跟大家分享下iOS为UIView设置阴影效果的实现过程,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • iOS实现点击状态栏自动回到顶部效果详解

    iOS实现点击状态栏自动回到顶部效果详解

    在IOS开发过程中,经常会有这种需求,需要通过点击状态栏返回到顶部,给用户更好的体验效果,下面这篇文章给大家详细介绍了实现过程,有需要的可以参考借鉴。
    2016-09-09
  • iOS仿高德首页推拉效果实例代码

    iOS仿高德首页推拉效果实例代码

    这篇文章主要给大家介绍了关于iOS仿高德首页推拉效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11

最新评论