咱們常見的一些像下雪、下雨、火苗這類的動畫,都是可使用粒子效果來實現。主要使用了類CAEmitterLayer
和CAEmitterCell
來實現。下面咱們將經過實現一個下雪的效果來講明該類的使用方法和各個屬性的含義。git
建立一個CAEmitterLayer
的實例,也就是建立一個發射器。github
CGRect rect = CGRectMake(0, 100, self.view.bounds.size.width, 50);
//建立發射器
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.frame = rect;
[self.view.layer addSublayer:emitter];
複製代碼
設置發射器類型數組
//設置發射器類型
emitter.emitterShape = kCAEmitterLayerRectangle;
複製代碼
這時候就要說一下屬性emitterShape
的取值了。有6種取值kCAEmitterLayerPoint
、kCAEmitterLayerLine
、kCAEmitterLayerRectangle
、kCAEmitterLayerCuboid
、kCAEmitterLayerCircle
和kCAEmitterLayerSphere
。簡單介紹幾種動畫
其餘三種先不說了。 須要注意的,上述所說的區域不是emitterLayer的,而是由屬性emitterPosition
和emitterSize
來確認的。 下面就來設置這兩個屬性的值,在該例子中,將其設置爲和layer同樣了。spa
emitter.emitterPosition = CGPointMake(rect.size.width*0.5, rect.size.height*0.5);
emitter.emitterSize = rect.size;
複製代碼
和咱們以前說過的Animation同樣,CAEmitterCell也只不過是咱們爲你用來展示粒子形態的一個數據模型。3d
咱們建立一個粒子,而且將圖片flake.png做爲其內容。接下來發射器會建立他的不少各類各樣的拷貝來模擬真實的雪花。code
CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
emitterCell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"flake"].CGImage);
複製代碼
接着添加代碼cdn
//設置粒子建立速率,也就是每秒產生的個數
emitterCell.birthRate = 20;
//設置粒子的生命週期,也就是在屏幕上存在的時間
emitterCell.lifetime = 3.5;
//將粒子賦給發射器
emitter.emitterCells = @[emitterCell];
複製代碼
須要解釋的是emitterCells屬性。咱們將emitterCells屬性設置爲一個存放着CAEmitterCell類型數據的數組。同一個發射器是能夠發射不一樣類型的粒子的。blog
這回運行程序,咱們將看到這樣的效果生命週期
咱們發現雖然產生了粒子,可是他們並不會運動。因此,繼續努力 添加代碼
//設置粒子建立速率,也就是每秒產生的個數
emitterCell.birthRate = 200;
//設置粒子的生命週期,也就是在屏幕上存在的時間
emitterCell.lifetime = 3.5;
//設置粒子聲明週期範圍
emitterCell.lifetimeRange = 1.0;
//將粒子賦給發射器
emitter.emitterCells = @[emitterCell];
//設置y軸上的加速度
emitterCell.yAcceleration = 70.0f;
//設置x軸上的加速度
emitterCell.xAcceleration = 10.0f;
//設置粒子的初始速度
emitterCell.velocity = 20;
//設置粒子的初始角度 若是不設置這個值,咱們發現粒子都是水平發射的
emitterCell.emissionLongitude = -M_PI_2;
//設置粒子的初始速度範圍 在此例子中範圍是 -180~220
emitterCell.velocityRange = 200.0f;
//設置粒子的初始角度範圍 此例子的範圍爲 M_PI~0
emitterCell.emissionRange = M_PI_2;
//設置粒子的顏色
emitterCell.color = [UIColor colorWithRed:0.9 green:1.0 blue:1.0 alpha:1.0].CGColor;
//咱們也能夠設置隨機顏色,而且限定範圍。由於RGB的值最大爲1.0,那Red來講,範圍並不會變爲0.6~1.3,而是0.6~1.0。類似的,若是是負值,則最小爲0
emitterCell.redRange = 0.3;
emitterCell.greenRange = 0.3;
emitterCell.blueRange = 0.3;
//設置粒子的大小及其大小範圍
emitterCell.scale = 0.8;
emitterCell.scaleRange = 0.8;
//設置讓粒子隨着時間推移每秒減少15%,若是設置爲正值則每秒增長
emitterCell.scaleSpeed = -0.15;
//設置粒子透明度的變化範圍
emitterCell.alphaRange = 0.75;
//設置粒子變化速度
emitterCell.alphaSpeed = -0.15;
複製代碼
好多屬性都是有range相關的類型,都是指定的範圍,沒有一個個的寫。 最終效果: