有没有办法暂停CABasicAnimation?

mcl*_*inj 45 iphone core-animation cabasicanimation

我有一个iPhone的基本旋转动画.有什么方法可以"暂停"动画,以便保持视图的位置?我想这样做的一种方法是让动画"完成"而不是在其上调用"删除",我该怎么做?

CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2];
rotationAnimation.duration = 100;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = HUGE_VALF;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
[myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
Run Code Online (Sandbox Code Playgroud)

Vla*_*mir 151

最近出现的Apple的技术说明QA1673描述了如何暂停/恢复图层的动画.

暂停和恢复动画列表如下:

-(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;
}
Run Code Online (Sandbox Code Playgroud)

编辑: iOS 10引入了新的API - UIViewPropertyAnimator,允许更加交互式地处理动画,例如,它可以轻松地暂停和恢复动画或"寻找"某些特定的进度值.


Sup*_*dar 12

回答Swift 3:

积分@Vladimir

码:

 func pauseAnimation(){
  let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
  layer.speed = 0.0
  layer.timeOffset = pausedTime
}

func resumeAnimation(){
  let pausedTime = layer.timeOffset
  layer.speed = 1.0
  layer.timeOffset = 0.0
  layer.beginTime = 0.0
  let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
  layer.beginTime = timeSincePause
}
Run Code Online (Sandbox Code Playgroud)


ger*_*ry3 6

设置视图图层的当前状态以匹配其状态presentationLayer,然后删除动画:

CALayer *pLayer = [myView.layer presentationLayer];
myView.layer.transform = pLayer.transform;
[myView.layer removeAnimationForKey:@"rotationAnimation"];
Run Code Online (Sandbox Code Playgroud)

  • 虽然这样可以保存位置,但是当我将动画重新添加到视图时,它不会作为起点,视图移动得稍慢,以适应相同时间内较短的距离.是否需要采取另一个步骤才能恢复停止的动画? (4认同)