![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwaYIByfV37PX-ChB5Yhx6H5t6eVBxbG5DYxtZAisTV5A377Ty3ryRdOMVc3-uNlXemI9xB5azOXhiSTmDcYDC1po4DAkKgsnTF92IKOpY9BLSRRoLkJh5WwpsOa5x-0uTmRI2DO009Atw/s320/Screenshot_15.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3x7XkTn36WwS465_8TYxPq-slpDr-FP7DJmF3hI_UfsFsxrLTDUYV0Qub-ydGQDwRj-fdms2guhALJbzuTk4JBNoswRPrtmM2O_Qe7XP9AJ06_qWBL3gyuWBBx6DxbZfWFHnDKdIbO7jg/s320/Screenshot_14.png)
延續前一篇 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,利用時間偏移量的概念重新計算暫停時間的偏移量好繼續動畫。
沒有留言:
張貼留言