-(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。