1.使用CAReplicatorLayer制作等待動畫
CALayer+CABasicAnimation可以制作很多簡單的動畫效果,之前的博客中介紹的“兩個動畫”,一個是利用一張漸變色圖片+CABasicAnimation制作的等待轉圈動畫,還有一個是利用CAShapeLayer制作的隨移動距離而漸變的按鈕動畫,而這次要制作的圓點縮放動畫用到的是CAReplicatorLayer,CAShapeLayer與CAReplicatorLayer都是CAlLayer的子類,根據不同應用場景,可以使用不同的layer來滿足要求。
動畫效果如圖:
實現過程,畫一個圓,復制三份,添加動畫效果即可
(1)CAReplicatorLayer之anchorPoint與position之間的關系
在制作動畫前,需要弄清楚anchorPoint與position之間的關系,對最終將動畫渲染在屏幕上的位置至關重要。
①position:CAReplicatorLayer的position決定了其在父視圖中位置坐標。
②anchorPoint:CAReplicatorLayer的anchorPoint決定了其position的位置。
anchorPoint的默認值為(0.5, 0.5),此時CAReplicatorLayer在父視圖中坐標位置對應其中心點的坐標。
而如果想使用父視圖一樣坐標系標准,即像添加普通的view一樣設置坐標,而不用去考慮計算position在CAReplicatorLayer中心點帶來的影響,將anchorPoint設置為(0, 0)即可,此時position的位置在CAReplicatorLayer的左上角頂點
(2)CAReplicatorLayer的相關重要參數
①instanceCount,CAReplicatorLayer中子元素的份數,
②instanceDelay,CAReplicatorLayer中子元素動畫執行時延遲時間,
③instanceTransform,CAReplicatorLayer中子元素形變方式,本例中主要就是X軸方向平移復制。
(3)初始化CAReplicatorLayer
如圖所示進行相關初始化,animationDuration為動畫執行一次的總時間,animationInstanceCount為拷貝后子元素的個數, instanceDelay = animationDuration / animationInstanceCount 是為了讓動畫看起來具有連續性
circle為動畫中的小圓點,anchorPoint采用默認值,小圓點的中心剛好在animationContainerView的邊界上,由於需要和animationContainerView邊界左對齊,所以把圓點circle往右移動了一個半徑的距離,如下圖所示,左圖為不設置偏移的情況,右圖為設置偏移后的情況。
(4)添加和移除動畫效果
autoreverses這個參數默認為NO,這里設置為YES,目的是重復執行動畫時,一次動畫執行完畢后,下一次動畫執行相反的效果,即這一次圓點執行縮小的動畫效果,下一次執行放大的動畫效果,這樣循環往復,讓動畫更具連續性,而不是縮小后突兀的就恢復原來大小。
2.強制更新
蘋果審核時不允許帶有版本檢測強制更新功能,如果需要加上強制更新功能以備不時之需,就需要提前設置好。
方法之一是:在某一時刻請求后台接口,檢測是否需要強制更新,例如applicationDidBecomeActive的時候,接口中約定好一個關於開啟強制更新的變量以及相關版本號,當需要強制更新時,通過檢測該變量及比較版本號即可通過彈框方式提醒甚至強制用戶去升級,當然這不是一個好的體驗。
3.遠程推送加語音提醒
之前博客記錄了關於遠程消息推送的東西,這次要在遠程消息推送基礎上加語音提示,語音提示主要是為了更方便的提示用戶接收推送信息,例如商家收到美團外賣訂單時,店內會聽到新訂單的語音提示,提醒商家接單。加語音提示主要有以下幾個關鍵點:
(1)工程相關准備,音頻文件及相關類庫
在工程里預先存放語音提示的音頻文件,供接收消息時播放,文件格式必須為aiff、wav或caf之一,這里將音頻文件存為了wav格式使用,且音頻文件播放時長需要控制在30秒以內,否則將自動被替換為默認語音提示。
本例中使用AVAudioPlayer播放音頻文件,所以需要引入AVFoundation.framework
(2)后台推送消息格式
在aps信息里的sound對應工程里存放的音頻文件名,注意后綴,本例中sound對應的文件名沒有加入后綴,而是在代碼中給音頻文件添加后綴。
(3)注意將AVAudioPlayer實例以屬性方式聲明
之前在函數中以臨時變量方式聲明AVAudioPlayer並播放音頻文件,一直沒有聲音,后來發現是還沒有來得及播放,AVAudioPlayer實例就已經被釋放了,以屬性方式聲明后解決此問題,相關代碼如下
(4)音量
仔細辨認可以發現,app在前台運行時收到推送消息播放語音提示的聲音是要略大於app在后台運行時收到推送消息播放語音提示的聲音,因為AVAudioPlayer控制的音量是在系統音量的級別上來進行調整,無法調節系統音量,如果要調節系統音量,需要再單獨處理,並且注意播放音頻文件后將系統音量恢復成原來大小。具體參考:iOS編程修改系統音量
4.UIView截屏
相關代碼如下所示:
5.參考
Core Animation Programming Guide--Core Animation Basics
CALayer Animation - Replicator Animation