iOS使用核心動畫和粒子發射器實現點贊按鈕的方法_IOS

來源:互聯網
上載者:User

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

實現的方法如下

一、使用到的類

  1. CAKeyframeAnimation       // 核心動畫-主要畫面格動畫
  2. CAEmitterLayer            // 粒子發射器(其實就是一個Layer,其父類是CALayer)
  3. CAEmitterCell             // 粒子
  4. PS:核心動畫應該不用多說了;
  5. 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;}

注意:這裡有一點需要詳細解釋一下, CAEmitterCell 的屬性一般有兩個參數:一個平均值和一個“Range”,比如:

// 粒子的生命週期和生命週期範圍 emitterCell.lifetime  = 0.7; emitterCell.lifetimeRange = 0.3;

這裡蘋果的官方文檔是這樣解釋的:

每一個Layer都有它自己的隨機數發生器,粒子的屬性大部分都被定義為一個平均值和一個範圍值,

如粒子的速度,這個屬性的值分布的區間為:[ M - R / 2,M + R / 2 ]。

然後 這個公式裡面

      M:均值(拿上面代碼說就是 emitterCell.lifetime)

      R:範圍值(mitterCell.lifetimeRange)

然後我們就可根據公式算出上面我設定的粒子的生命週期的範圍是[0.7-0.3/2 , 0.7+0.3/2]

2.6 keyframeAnimation 方法中 (開始主要畫面格動畫)

- (void)animation { // 建立主要畫面格動畫  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; // 粒子發射器 發射 [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(); // 執行停止 [self performSelector:@selector(stopFire) withObject:nil afterDelay:0.1];}

2.8 stopFire 方法中 (停火)

- (void)stopFire { //每秒噴射的個數0個 就意味著關閉了 [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"]; }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.