Core Animation動畫暫停和恢復

-(void)pauseLayer:(CALayer*)layer {
   CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
   layer.speed = 0.0;
   layer.timeOffset = pausedTime;
}
 
-(void)resumeLayer:(CALayer*)layer {
   CFTimeInterval pausedTime = [layer timeOffset];
   layer.speed = 1.0;
   layer.timeOffset = 0.0;
   layer.beginTime = 0.0;
   CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
   layer.beginTime = timeSincePause;
}

/* Additional offset in active local time. i.e. to convert from parent
* time tp to active local time t: t = (tp - begin) * speed + offset.
* One use of this is to "pause" a layer by setting `speed' to zero and
* `offset' to a suitable value. Defaults to 0. */
@property CFTimeInterval timeOffset;
/* The begin time of the object, in relation to its parent object, if
* applicable. Defaults to 0. */
@property CFTimeInterval beginTime

因爲父對象的時間轉換爲有效本地時間是通過t = (tp - begin) * speed + offset計算的。

當暫停時,speed被設置爲0.0,父對象的時間轉換爲有效本地時間需要設置offset爲當前本地時間。

當恢復時,speed被設置爲1.0,父對象的時間轉換爲有效本地時間需要設置offset爲0.0,beginTime爲經過的本地時間。因爲tp(父對象時間)已經經過了timeSincePause,所以t = (tp - begin) * speed + offset的begin需要設置爲timeSincePause。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章