0

Я пытаюсь вызвать метод всякий раз, когда заканчивается эта анимация, но в некоторых случаях, например, когда пользователь покидает приложение, его блок завершения никогда не вызывается. Также, когда VC появляется с его анимацией одновременно с анимацией UIView, блок завершения никогда не вызывается.Блок завершения анимации UIView не вызывается, когда анимация прерывается

Что делать, чтобы вызвать обратный вызов, даже если анимация прервана? Должен ли я вообще не использовать блок завершения анимации UIView и вместо этого использовать что-то другое? Пожалуйста, просветите меня ..!

-(void)action { 

[UIView animateWithDuration:0.3 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 

        self.doorLeft.frame = CGRectMake(0, 0, self.doorLeft.frame.size.width, self.doorLeft.frame.size.height); 
        self.doorRight.frame = CGRectMake(self.frame.size.width -self.doorRight.frame.size.width, 0, self.doorRight.frame.size.width, self.doorRight.frame.size.height); 

       } completion:^(BOOL finished){ 
        if (finished) { 
         switch (self.type) { 
          case 0: 
           [self.delegate startTOship]; 
           break; 
          case 1: 
           [self.delegate gameTOship]; 
           break; 
          case 2: 
           [self.delegate shipTOgame]; 
           break; 
          case 3: 
           [self.delegate shipTOmap]; 
           break; 
          case 4: 
           [self.delegate gameTOmap]; 
           break; 
          case 5: 
           [self.delegate mapTOgame]; 
           break; 
          case 6: 
           [self.delegate mapTOship]; 
           break; 
         } 

         [UIView animateWithDuration:0.3 
               delay:0.5 
              options:UIViewAnimationOptionCurveEaseOut 
              animations:^{ 

               self.doorLeft.frame = CGRectMake(-self.doorLeft.frame.size.width, 0, self.doorLeft.frame.size.width, self.doorLeft.frame.size.height); 
               self.doorRight.frame = CGRectMake(self.doorRight.frame.size.width *2, 0, self.doorRight.frame.size.width, self.doorRight.frame.size.height); 

              } completion:^(BOOL finished){ 
               if (finished) { 

                [self actionEnded]; 
               } 
              } 
          ]; 
        } 
       } 
];} 

ответ

0

Что вы можете сделать, это вместо этого использовать CATransaction.

[CATransaction begin]; 

[CATransaction setCompletionBlock:^{ 
    [self actionEnded] 
}]; 

[UIView animateWithDuration:8.3 delay:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^{ 

    self.doorLeft.frame = CGRectMake(-self.doorLeft.frame.size.width, 0, self.doorLeft.frame.size.width, self.doorLeft.frame.size.height); 
    self.doorRight.frame = CGRectMake(self.doorRight.frame.size.width *2, 0, self.doorRight.frame.size.width, self.doorRight.frame.size.height); 

} completion:nil]; 

[CATransaction commit]; 

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

P.S: CATransaction работает со всеми UIView анимациями. Пока вы говорите begin перед анимацией и commit после кода анимации.

+0

Хммм, если у меня есть «цепная» анимация, которая имеет несколько анимаций один за другим, как в моем отредактированном вопросе? – durazno

+0

Затем добавьте блок фиксации после последнего кода анимации. – Tander

+0

Хмм, но я думаю, что мне придется пойти с CAKeyframeAnimation, потому что то, что я делаю, нуждается именно в этом. CAKeyframeAnimation также гарантирует, что его блок завершения вызывается немедленно, когда анимация прерывается или мне нужно использовать ее вместе с CATransition ..? – durazno