iOS使用核心動(dòng)畫和粒子發(fā)射器實(shí)現(xiàn)點(diǎn)贊按鈕的方法
首先放上效果圖,大家可以看一下

實(shí)現(xiàn)的方法如下
一、使用到的類
- CAKeyframeAnimation // 核心動(dòng)畫-關(guān)鍵幀動(dòng)畫
- CAEmitterLayer // 粒子發(fā)射器(其實(shí)就是一個(gè)Layer,其父類是CALayer)
- CAEmitterCell // 粒子
- PS:核心動(dòng)畫應(yīng)該不用多說了;
- CAEmitterLayer和CAEmitterCell,其實(shí)可以比喻成“炮”和“炮彈”,應(yīng)該不難理解;
二、直接上部分關(guān)鍵代碼 代碼中會(huì)有詳細(xì)的注釋
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];
// 開始關(guān)鍵幀動(dòng)畫
[self keyframeAnimation];
}
2.4 layoutSubviews 方法中
- (void)layoutSubviews{
[super layoutSubviews];
/// 設(shè)置粒子發(fā)射器的錨點(diǎn)
_emitterLayer.position = self.imageView.center;
}
2.5 setupEmitter 方法中( 配置粒子發(fā)射器方法 )
- (void)setup {
// 粒子使用CAEmitterCell初始化
CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
// 粒子的名字,在設(shè)置噴射個(gè)數(shù)的時(shí)候會(huì)用到
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;
// 設(shè)置粒子的圖片
emitterCell.contents = (id)[UIImage imageNamed:@"Sparkle3"].CGImage;
/// 初始化粒子發(fā)射器
CAEmitterLayer *layer = [CAEmitterLayer layer];
// 粒子發(fā)射器的 名稱
layer.name = @"emitterLayer";
// 粒子發(fā)射器的 形狀(可以想象成打仗時(shí),你需要的使用的炮的形狀)
layer.emitterShape = kCAEmitterLayerCircle;
// 粒子發(fā)射器 發(fā)射的模式
layer.emitterMode = kCAEmitterLayerOutline;
// 粒子發(fā)射器 中的粒子 (炮要使用的炮彈)
layer.emitterCells = @[emitterCell];
// 定義粒子細(xì)胞是如何被呈現(xiàn)到layer中的
layer.renderMode = kCAEmitterLayerOldestFirst;
// 不要修剪layer的邊界
layer.masksToBounds = NO;
// z 軸的相對(duì)坐標(biāo) 設(shè)置為-1 可以讓粒子發(fā)射器layer在self.layer下面
layer.zPosition = -1;
// 添加layer
[self.layer addSublayer:layer];
_emitterLayer = layer;
}
注意:這里有一點(diǎn)需要詳細(xì)解釋一下, CAEmitterCell 的屬性一般有兩個(gè)參數(shù):一個(gè)平均值和一個(gè)“Range”,比如:
// 粒子的生命周期和生命周期范圍 emitterCell.lifetime = 0.7; emitterCell.lifetimeRange = 0.3;
這里蘋果的官方文檔是這樣解釋的:
每一個(gè)Layer都有它自己的隨機(jī)數(shù)發(fā)生器,粒子的屬性大部分都被定義為一個(gè)平均值和一個(gè)范圍值,
如粒子的速度,這個(gè)屬性的值分布的區(qū)間為:[ M - R / 2,M + R / 2 ]。
然后 這個(gè)公式里面
M:均值(拿上面代碼說就是 emitterCell.lifetime)
R:范圍值(mitterCell.lifetimeRange)
然后我們就可根據(jù)公式算出上面我設(shè)置的粒子的生命周期的范圍是[0.7-0.3/2 , 0.7+0.3/2]
2.6 keyframeAnimation 方法中 (開始關(guān)鍵幀動(dòng)畫)
- (void)animation {
// 創(chuàng)建關(guān)鍵幀動(dò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;
}
// 動(dòng)畫模式
animation.calculationMode = kCAAnimationCubic;
[self.imageView.layer addAnimation:animation forKey:@"transform.scale"];
}
這段代碼沒什么說的,應(yīng)該很容易理解。
2.7 startFire 方法中 (開炮)
- (void)startFire{
// 每秒噴射的80個(gè)
[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 {
//每秒噴射的個(gè)數(shù)0個(gè) 就意味著關(guān)閉了
[self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"];
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
iOS利用NSAttributedString實(shí)現(xiàn)圖文混排效果示例
iOS7以后,因?yàn)門extKit的強(qiáng)大,可以用NSAttributedString很方便的實(shí)現(xiàn)圖文混排(主要是利用了NSTextAttachment),所以下面這篇文章主要給大家介紹了關(guān)于iOS利用NSAttributedString實(shí)現(xiàn)圖文混排效果的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
swift 單例的實(shí)現(xiàn)方法及實(shí)例
這篇文章主要介紹了swift 單例的實(shí)現(xiàn)方法及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07
詳解iOS應(yīng)用中自定義UIBarButtonItem導(dǎo)航按鈕的創(chuàng)建方法
這篇文章主要介紹了iOS應(yīng)用中自定義UIBarButtonItem導(dǎo)航按鈕的創(chuàng)建方法,文中舉了一個(gè)自定義圖片的UIBarButtonItem實(shí)例,比較具有代表性,需要的朋友可以參考下2016-04-04
iOS實(shí)現(xiàn)毫秒倒計(jì)時(shí)的方法詳解
倒計(jì)時(shí)在我們?nèi)粘i_發(fā)中必不可少,最近在公司的一個(gè)項(xiàng)目中就遇到了這個(gè)需求,本文著重介紹的是利用iOS實(shí)現(xiàn)毫秒倒計(jì)時(shí)的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-04-04
iOS中獲取系統(tǒng)相冊(cè)中的圖片實(shí)例
這篇文章主要介紹了iOS中獲取系統(tǒng)相冊(cè)中的圖片實(shí)例,具有一定的參考價(jià)值沒有需要的朋友可以了解一下。2016-11-11
iOS如何跳轉(zhuǎn)到App Store下載評(píng)分頁面示例代碼
最近在工作中遇到一個(gè)需求,需要跳轉(zhuǎn)到App Store下載評(píng)分,通過查找相關(guān)的資料最終解決了,下面這篇文章主要給大家介紹了關(guān)于iOS如何跳轉(zhuǎn)到App Store下載評(píng)分頁面的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12

