粒子動畫
粒子動畫主要是通過CAEmitterLayer
和CAEmitterCell
來完成稀轨。使用粒子動畫可以實現(xiàn)很多的特效填物,比如紅包雨,點擊幌缝、星星等灸促。
CAEmitterLayer
CAEmitterLayer
是CALayer
的子類,該類用于實現(xiàn)粒子發(fā)射器涵卵。通過它來發(fā)射粒子來展現(xiàn)動畫浴栽。CAEmitterLayer
常用屬性如下所示:
-
emitterCells
粒子數(shù)組,用于添加CAEmitterLayer
對象轿偎。
-
birthRate
用于設(shè)置粒子產(chǎn)生的系數(shù)典鸡,默認為1,如果設(shè)置為0可以停止發(fā)射粒子贴硫,用于控制動畫的暫停椿每。
-
lifetime
粒子的生命周期,用于控制粒子在屏幕上顯示的時間英遭。
-
emitterPosition
粒子發(fā)射的位置间护,默認為原點坐標,還有個emitterZPosition
屬性挖诸,主要是跟三維的位置相關(guān)汁尺,先不做具體的說明。
-
emitterSize
用于設(shè)置發(fā)射器的尺寸多律。
-
emitterShape
表示粒子從什么形狀發(fā)射出來痴突。主要包括以下幾種枚舉類型:
kCAEmitterLayerPoint
kCAEmitterLayerLine
kCAEmitterLayerRectangle
kCAEmitterLayerCuboid
kCAEmitterLayerCircle
kCAEmitterLayerSphere
-
emitterMode
發(fā)射模式搂蜓,用于決定粒子具體的形狀。主要包括以下幾種枚舉類型:
kCAEmitterLayerPoints
kCAEmitterLayerOutline
kCAEmitterLayerSurface
kCAEmitterLayerVolume
-
velocity
用于設(shè)置粒子的運行速度的系數(shù)辽装。
-
scale
用于設(shè)置縮放比例帮碰。
-
spin
用于設(shè)置粒子的自旋轉(zhuǎn)速度系數(shù)。
-
speed
用于設(shè)置粒子的隨機數(shù)發(fā)射器拾积。
CAEmitterCell
**CAEmitterCell**
是一個粒子單元殉挽,是通過CAEmitterLayer
進行發(fā)射的一個粒子單元,CAEmitterLayer
也可以發(fā)射粒子拓巧。常用的屬性如下所示:
-
name
用于設(shè)置粒子的名稱斯碌。
-
enabled
用于設(shè)置粒子是否顯示仪召。
-
birthRate
用于設(shè)置粒子的產(chǎn)生率汗唱。
-
lifetime
粒子的生命周期。
-
lifetimeRange
粒子生命周期的范圍惶我。
-
emissionRange
粒子發(fā)射角度的范圍承耿。
-
emissionLatitude
設(shè)置粒子的緯度角冠骄,相對于發(fā)射形狀的自然方位角,用于控制不同的方向瘩绒。
-
emissionLongitude
設(shè)置粒子的經(jīng)度角猴抹,相對于發(fā)射形狀的自然方位角,用于控制不同的方向锁荔。
-
velocity
用于設(shè)置粒子的運行速度的系數(shù)蝙砌。
-
velocityRange
用于設(shè)置粒子的運行速度系數(shù)的范圍。
-
scale
用于設(shè)置縮放比例恬总。
-
scaleRange
用于設(shè)置縮放比例范圍壹堰。
-
scaleSpeed
用于設(shè)置縮放比例的速度贱纠。
-
spin
用于設(shè)置粒子的自旋轉(zhuǎn)速度系數(shù)谆焊。
-
spinRange
用于設(shè)置粒子的自旋轉(zhuǎn)速度系數(shù)范圍辖试。
-
contents
用于設(shè)置粒子的內(nèi)容罐孝,默認為CGImageRef的對象。
-
emitterCells
粒子里面創(chuàng)建的粒子汹来。
-
color
用于設(shè)置粒子的顏色俗慈,redRange
闺阱、greenRange
酣溃、blueRange
赊豌、alphaRange
:這些是對應的color的RGBA的取值范圍,取值范圍為01碘饼。`redSpeed`悲伶、`greenSpeed`麸锉、`blueSpeed`花沉、`alphaSpeed`:這些是對應的是粒子的RGBA的變化速度碱屁,取值范圍為01忽媒。表示每秒鐘的RGBA的變化率。
下面實現(xiàn)一個點贊的動畫,效果如下所示:
#import "MLLiveLikeViewController.h"
@interface MLLiveLikeViewController ()
@property (nonatomic,strong) UIButton *likeBtn;
@property (nonatomic,strong) NSMutableArray *boomCells;
@property (nonatomic,strong) CAEmitterLayer *emitterLayer;
@end
@implementation MLLiveLikeViewController
[個人博客](http://gzcopyright.cn/)
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.likeBtn];
}
- (UIButton *)likeBtn{
if(!_likeBtn){
_likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = self.view.frame;
_likeBtn.frame = CGRectMake(frame.size.width / 2 - 30, frame.size.height / 2 - 10, 60, 30);
[_likeBtn setTitle:@"點贊" forState:UIControlStateNormal];
[_likeBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_likeBtn addTarget:self action:@selector(likeAction) forControlEvents:UIControlEventTouchUpInside];
}
return _likeBtn;
}
-(void)likeAction{
[self addCAEmitteAnimation];
}
-(void)addCAEmitteAnimation
{
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.frame = self.likeBtn.frame;
emitter.lifetime = 10;
[self.view.layer addSublayer:emitter];
emitter.emitterShape = kCAEmitterLayerCircle;
emitter.emitterMode = kCAEmitterLayerCircle;
emitter.emitterPosition = CGPointMake(emitter.frame.size.width/2, emitter.frame.size.height/2);
CAEmitterCell *cell = [[CAEmitterCell alloc] init];
cell.contents = (__bridge id)[UIImage imageNamed:@"heart2"].CGImage;
//產(chǎn)生粒子的個數(shù)
cell.birthRate = 15;
//粒子的生命周期
cell.lifetime = 0.5;
cell.lifetimeRange = 1;
//粒子透明度變化
cell.alphaSpeed = -0.4;
//粒子速度
cell.velocity = 100;
cell.velocityRange = 1000;
//粒子發(fā)射方向
cell.emissionRange = M_PI *2.0;
//旋轉(zhuǎn)
cell.spin = 0.1;
cell.spin = 1;
emitter.emitterCells = @[cell];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
emitter.birthRate = 0;//停止發(fā)射
});
}
具體的代碼可以在demo中查看