iOS使用核心動畫和粒子發(fā)射器實現(xiàn)點贊按鈕的方法
首先放上效果圖,大家可以看一下
實現(xiàn)的方法如下
一、使用到的類
- CAKeyframeAnimation // 核心動畫-關鍵幀動畫
- CAEmitterLayer // 粒子發(fā)射器(其實就是一個Layer,其父類是CALayer)
- CAEmitterCell // 粒子
- PS:核心動畫應該不用多說了;
- CAEmitterLayer和CAEmitterCell,其實可以比喻成“炮”和“炮彈”,應該不難理解;
二、直接上部分關鍵代碼 代碼中會有詳細的注釋
2.1 .m中需要擁有的屬性
/** weak類型 粒子發(fā)射器 */ @property (nonatomic, weak) CAEmitterLayer *emitterLayer;
2.2 initWithFrame: 方法中
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // 配置粒子發(fā)射器方法 [self setupEmitter]; } return self; }
2.3 setSelected: 方法中
- (void)setSelected:(BOOL)selected { [super setSelected:selected]; // 開始關鍵幀動畫 [self keyframeAnimation]; }
2.4 layoutSubviews 方法中
- (void)layoutSubviews{ [super layoutSubviews]; /// 設置粒子發(fā)射器的錨點 _emitterLayer.position = self.imageView.center; }
2.5 setupEmitter 方法中( 配置粒子發(fā)射器方法 )
- (void)setup { // 粒子使用CAEmitterCell初始化 CAEmitterCell *emitterCell = [CAEmitterCell emitterCell]; // 粒子的名字,在設置噴射個數(shù)的時候會用到 emitterCell.name = @"emitterCell"; // 粒子的生命周期和生命周期范圍 emitterCell.lifetime = 0.7; emitterCell.lifetimeRange = 0.3; // 粒子的發(fā)射速度和速度的范圍 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; /// 初始化粒子發(fā)射器 CAEmitterLayer *layer = [CAEmitterLayer layer]; // 粒子發(fā)射器的 名稱 layer.name = @"emitterLayer"; // 粒子發(fā)射器的 形狀(可以想象成打仗時,你需要的使用的炮的形狀) layer.emitterShape = kCAEmitterLayerCircle; // 粒子發(fā)射器 發(fā)射的模式 layer.emitterMode = kCAEmitterLayerOutline; // 粒子發(fā)射器 中的粒子 (炮要使用的炮彈) layer.emitterCells = @[emitterCell]; // 定義粒子細胞是如何被呈現(xiàn)到layer中的 layer.renderMode = kCAEmitterLayerOldestFirst; // 不要修剪layer的邊界 layer.masksToBounds = NO; // z 軸的相對坐標 設置為-1 可以讓粒子發(fā)射器layer在self.layer下面 layer.zPosition = -1; // 添加layer [self.layer addSublayer:layer]; _emitterLayer = layer; }
注意:這里有一點需要詳細解釋一下, CAEmitterCell
的屬性一般有兩個參數(shù):一個平均值和一個“Range
”,比如:
// 粒子的生命周期和生命周期范圍 emitterCell.lifetime = 0.7; emitterCell.lifetimeRange = 0.3;
這里蘋果的官方文檔是這樣解釋的:
每一個Layer都有它自己的隨機數(shù)發(fā)生器,粒子的屬性大部分都被定義為一個平均值和一個范圍值,
如粒子的速度,這個屬性的值分布的區(qū)間為:[ M - R / 2,M + R / 2 ]。
然后 這個公式里面
M:均值(拿上面代碼說就是 emitterCell.lifetime
)
R:范圍值(mitterCell.lifetimeRange
)
然后我們就可根據(jù)公式算出上面我設置的粒子的生命周期的范圍是[0.7-0.3/2 , 0.7+0.3/2]
2.6 keyframeAnimation 方法中 (開始關鍵幀動畫)
- (void)animation { // 創(chuàng)建關鍵幀動畫 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; // 粒子發(fā)射器 發(fā)射 [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(); // 執(zhí)行停止 [self performSelector:@selector(stopFire) withObject:nil afterDelay:0.1]; }
2.8 stopFire 方法中 (停火)
- (void)stopFire { //每秒噴射的個數(shù)0個 就意味著關閉了 [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"]; }
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關文章
iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法
在iOS開發(fā)過程中經(jīng)常需要與服務器進行數(shù)據(jù)通訊,Json就是一種常用的高效簡潔的數(shù)據(jù)格式,通過本文給大家介紹iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法,感興趣的朋友參考下2016-01-01iOS實現(xiàn)點擊狀態(tài)欄自動回到頂部效果詳解
在IOS開發(fā)過程中,經(jīng)常會有這種需求,需要通過點擊狀態(tài)欄返回到頂部,給用戶更好的體驗效果,下面這篇文章給大家詳細介紹了實現(xiàn)過程,有需要的可以參考借鑒。2016-09-09