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

2020-01-18 18:03:15王旭

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

ios开发点赞功能实现,ios,点赞按钮,ios粒子发射器

实现的方法如下

一、使用到的类

    CAKeyframeAnimation       // 核心动画-关键帧动画 CAEmitterLayer            // 粒子发射器(其实就是一个Layer,其父类是CALayer) CAEmitterCell             // 粒子 PS:核心动画应该不用多说了; 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;
}