close
当前位置: 物联网在线 > 技术文库 > ios >

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

1.使用到的类

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

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

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; }

ps:这里有一点需要详细解释一下, 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"]; }

最后放两张效果图


(责任编辑:ioter)


用户喜欢...

iOS开发笔记 - 仿京东的加入购物车动画

请叫我死肥宅 之前APP里的加入购物车动画是最简单的UIView动画(一句代码那种),这几天正好有时间所以就跟产品那边确认优化了一下。虽然产品嘴上说让我自由发挥,但我相信没处理好肯...


iOS监控:资源使用

应用性能的衡量标准有很多,从用户的角度来看,卡顿是最明显的表现,但这不意味看起来不卡顿的应用就不存在性能问题。从开发角度来看,衡量一段代码或者说算法的标准包括空间复杂度...


iOS高可控性日历基础组件-SKCalendarView的使用和实现思路的分享

SKCalendarView是一个高可控性的日历基础组件,为了提高应用的自由度,默认只提供了日历部分的视图封装,但不涵盖切换月份按钮、年月分显示等非关键性控件,但请不要担心,SKCalendarView为...


快速入门指南:使用 UIViewPropertyAnimator 做动画

iOS 10 带来了一堆非常有意思的新特性,例如 UIViewPropertyAnimator 。这是一个能够改善动画处理方式的新类。 它彻底改变了我们所习惯的工作流,为动画逻辑添加了一个更为精细的控制手段。...


iOS开源-轻量级 JSON 转 Model 框架,使用链式编程,无侵入

SuperKVC is a light-weight injection framework to convert JSON to Model. SuperKVC has its own config DSL which provides a chainable way of describing your injection config concise and readable. SuperKVC supports iOS and macOS. Samples are at the Su...


iOS 自定义转场动画浅谈

路漫漫其修远兮,吾将上下而求索 开门效果.gif 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不多有10天的时间,终于对转场动画了解了一点。自从 iOS 7 以后...


iOS 使用输入框的inputAccessoryView属性实现键盘上添加视图

在开发应用程序时会经常用到输入消息并发送消息的功能,比如今日头条或者UC头条这些软件底部都会有,如何想向这些应用一样点击UITextField或者UITextView就可以弹出键盘并在键盘上也能加上...


iOS开源:Tkeyboard - 通过蓝牙,使用 Mac 的键盘输入内容到 iPhone 设备中

在咖啡馆耗费了数个周末之后,终于将这个灵光一闪的点子变成了一个实实在在可以运行的 app。同时意味着年初制定的第一个小目标达成,完成了 2017年的第一个独立 app。 在app上架的同时,...


iOS 动画进阶 - 实现炫酷的上拉刷新动效

最近撸了一个上拉刷新的小轮子,只要遵循一个协议就能自定义自己动效的上拉刷新和加载,我自己也写了几个动效进去,下面是一个比较好的动效的实现过程 先上效果图和 github地址 ,有其...


iOS控件CHIPageControl:酷帅的翻页状态切换动画组件

CHIPageControl is a set of cool animated page controls to replace boring UIPageControl. We were inspired by Jardson Almeida dribbble shot and implemented a few more page controls. Made with :heart: by Chili . Overview Requirements iOS 9.0+ Xcode 8+...