0

Ich versuche eine Methode immer dann aufzurufen, wenn diese Animation endet, aber in einigen Fällen, zum Beispiel wenn der Benutzer die App verlässt, wird sein Vervollständigungsblock nie aufgerufen. Auch wenn ein VC mit seiner Animation zur gleichen Zeit wie die UIView-Animation angezeigt wird, wird der Completion-Block nie aufgerufen.UIView Animation Vervollständigungsblock wird nicht aufgerufen, wenn die Animation unterbrochen wird

Was soll ich tun, um sicherzustellen, dass der Callback auch dann aufgerufen wird, wenn die Animation irgendwie unterbrochen ist? Sollte ich UIView Animation Completion Block überhaupt nicht verwenden und stattdessen etwas anderes verwenden? Bitte erleuchte mich..!

-(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]; 
               } 
              } 
          ]; 
        } 
       } 
];} 

Antwort

0

Was Sie tun können, ist stattdessen CATransaction verwenden.

[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]; 

Wenn die Animation überhaupt unterbrochen wird, wird der Abschluss Block fast sofort Der Block auch genannt wird aufgerufen, wenn Animation ohne Unterbrechung abgeschlossen ist.

S.: CATransaction arbeitet mit allen UIView Animationen. Solange Sie sagen, begin vor der Animation passiert und commit nach dem Animationscode.

+0

Hmmm was ist, wenn ich eine "verkettete" Animation habe, die mehrere Animationen nacheinander in meiner bearbeiteten Frage hat? – durazno

+0

Fügen Sie anschließend den Festschreibungsblock nach dem letzten Animationscode hinzu. – Tander

+0

Hmm aber ich denke, ich müsste doch mit CAKeyframeAnimation gehen, denn was ich gerade mache, braucht genau das. Stellt CAKeyframeAnimation auch sicher, dass der Completion-Block sofort aufgerufen wird, wenn die Animation unterbrochen wird, oder muss ich ihn zusammen mit CATransition verwenden? – durazno