延續前一篇 CABasicAnimation 的基本寫法一文,這次要示範如在動畫執行期間實做暫停與恢復的效果,沿用先前的程式碼,在介面上多加一個 UISwitch,目的是用來控制動畫的暫停與播放,其按鈕事件的程式碼如下。
//暫停與恢復
- (IBAction)onPlaySwitch:(id)sender {
if (!playSwitch.on) {
//暫停時紀錄目前執行時間
CFTimeInterval pausedTime = [imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
imageView.layer.timeOffset = pausedTime;
//停止動作
imageView.layer.speed = 0.0;
}
else {
//取得先前的停止時間
CFTimeInterval pausedTime = [imageView.layer timeOffset];
//開始動作
imageView.layer.speed = 1.0;
//計算並設定時間偏移量
CFTimeInterval timeSincePause = [imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
imageView.layer.beginTime = timeSincePause;
}
}
上述程式碼在按鈕狀態為 OFF 時,會將動畫暫停,並將目前以執行的時間暫存於 timeOffset 中,以便稍後恢復動畫時計算時間的偏移量,而在按鈕狀態為 ON 時,先取得先前紀錄的最後執行時間,並在開始動畫之後計算時間偏移量,最後才設定動畫開始的時間,這邊要注意恢復動畫的程式碼順序不能任意調換,因為只有在開始動畫之後才有辦法取得執行時間,也才能夠計算時間偏移量。
最後,在此範例中其實並未真正停止動畫,也就是設定 Timer,我們只是將動畫速度 speed 設定成 0 讓使用者誤以為動畫已經停止了,其實 Timer 還是繼續在執行,之後再將 speed 參數設定為正常速度 1.0,利用時間偏移量的概念重新計算暫停時間的偏移量好繼續動畫。
沒有留言:
張貼留言