Восстановление анимации с того места, где она закончилась при возобновлении приложения из фона

У меня есть бесконечно зацикленная CABasicAnimation повторяющаяся плитка изображения в моем представлении:

a = [CABasicAnimation animationWithKeyPath:@"position"];
a.timingFunction = [CAMediaTimingFunction 
                      functionWithName:kCAMediaTimingFunctionLinear];
a.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
a.toValue = [NSValue valueWithCGPoint:CGPointMake(image.size.width, 0)];
a.repeatCount = HUGE_VALF;
a.duration = 15.0;
[a retain];

Я пытался "приостановить и возобновить" анимацию слоя, как описано в Technical Q&A QA1673.

Когда приложение переходит в фоновый режим, анимация удаляется из слоя. Для компенсации я слушаю UIApplicationDidEnterBackgroundNotification и вызываю stopAnimation, а в ответ на UIApplicationWillEnterForegroundNotification вызываю startAnimation.

- (void)startAnimation 
{
    if ([[self.layer animationKeys] count] == 0)
        [self.layer addAnimation:a forKey:@"position"];

    CFTimeInterval pausedTime = [self.layer timeOffset];
    self.layer.speed = 1.0;
    self.layer.timeOffset = 0.0;
    self.layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = 
      [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    self.layer.beginTime = timeSincePause;
}

- (void)stopAnimation 
{
    CFTimeInterval pausedTime = 
      [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = pausedTime;    
}

Проблема в том, что он снова начинается с самого начала и происходит уродливый скачок от последней позиции, как видно на снимке приложения, который система сделала, когда приложение действительно вошло в фон, обратно к началу цикла анимации.

Я не могу понять, как сделать так, чтобы при повторном добавлении анимации она начиналась с последней позиции. Честно говоря, я просто не понимаю, как работает этот код из QA1673: в resumeLayer он дважды устанавливает layer.beginTime, что кажется излишним. Но когда я убрал первую установку в ноль, это не возобновило анимацию там, где она была приостановлена. Это было проверено с помощью простого распознавателя жестов, который переключил анимацию - это не связано с моими проблемами с восстановлением из фона.

Какое состояние я должен запомнить перед удалением анимации и как мне восстановить анимацию из этого состояния, когда я добавляю ее позже?

56
задан Palimondo 28 September 2011 в 19:05
поделиться