Приостановка анимации CALayer с анимацией с задержкой

У меня есть набор вложенных UIViewанимаций (2 или 3 уровня глубины в данный момент времени), которые я хотел бы иметь возможность для паузы и возобновления. Некоторые из этих анимаций используют -animateWithDuration:animations:completion:, а другие используют -animateWithDuration:delay:options:animations:completion:для задержки выполнения блока анимации.

Я прочитал и реализовал Технические вопросы и ответы QA1673о приостановке всех анимаций в дереве слоев, но столкнулся с проблемой с анимациями, использующими параметр задержки. Я могу приостанавливать и возобновлять анимацию просто отлично, но когда анимация возобновляется, любой блок анимации, с которым связана задержка, кажется, имеет задержку, увеличенную на время, в течение которого дерево слоев было приостановлено. Так, например, если один из блоков имеет задержку 1 секунду, а дерево слоев было приостановлено на 3 секунды, анимация после возобновления задерживается на 4 секунды. Я предполагаю, что это как-то связано со свойством beginTime? Любая помощь будет оценена по достоинству.

// Pause and Resume methods, right from the technical Q&A
- (void)pauseAnimationsOnLayer:(CALayer *)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

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

// Chained animations
- (void)animateNextPopup
{
    [UIView animateWithDuration:kRFPVictorySequenceStatePopupDuration
                     animations:^{
                         [_currentStateImageView setHidden:NO];
                         [_currentStateImageView setTransform:CGAffineTransformIdentity];

                     }
                     completion:^(BOOL finished) {
                         [UIView animateWithDuration:kRFPVictorySequenceStateSlideOffDuration
                                               delay:kRFPVictorySequenceStateVoteDelay
                                             options:UIViewAnimationOptionCurveEaseInOut
                                          animations:^{
                                              if (winnerIsDem) {
                                                  [_currentStateImageView setFrame:CGRectMake(-_currentStateImageView.frame.size.width, 
                                                                                              _currentStateImageView.frame.origin.y, 
                                                                                              _currentStateImageView.frame.size.width, 
                                                                                              _currentStateImageView.frame.size.height)];
                                              }
                                              else {
                                                  [_currentStateImageView setFrame:CGRectMake(1024, 
                                                                                              _currentStateImageView.frame.origin.y, 
                                                                                              _currentStateImageView.frame.size.width, 
                                                                                              _currentStateImageView.frame.size.height)];
                                              }
                                          }
                                          completion:^(BOOL finished) {
                                              // Do some stuff
                                          }
                          ];
                     }
     ];
}

8
задан Suraj Sonawane 2 January 2016 в 14:33
поделиться

0 ответов