У меня есть основная анимация вращения 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"];
Недавно появившаяся техническая заметка 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;
}
Редактировать:. В iOS 10 появился новый API - UIViewPropertyAnimator, который позволяет работать с анимацией более интерактивно, например, легко приостанавливать и возобновлять анимацию или "стремиться" к определенному значению прогресса.
Set current state of your view's layer to match the state of the presentationLayer
, then remove the animation:
CALayer *pLayer = [myView.layer presentationLayer];
myView.layer.transform = pLayer.transform;
[myView.layer removeAnimationForKey:@"rotationAnimation"];