0

Bu animasyon bittiğinde bir yöntem denemeye çalışıyorum, ancak bazı durumlarda, örneğin kullanıcı uygulamadan çıktığında, tamamlanma bloğu asla çağrılmaz. Ayrıca, UIView animasyonuyla aynı zamanda bir animasyon ile bir VC görüntülendiğinde, tamamlanma bloğu hiçbir zaman aranmaz.UIView animasyon tamamlama bloğu, animasyon kesintiye uğradığında çağrılmadı

Animasyon bir şekilde kesilse bile geri aranmanın çağrıldığından emin olmak için ne yapmalıyım? UIView animasyon tamamlama bloğunu hiç kullanmamalı ve bunun yerine başka bir şey kullanmalı mıyım? Lütfen beni aydınlat..!

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

cevap

0

Yapabilecekleriniz, CATransaction yerine kullanmaktır. animasyon kesilirse

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

, tamamlama blok animasyon kesintisiz tamamladığında blok olarak da adlandırılır hemen adlandırılır.

Not: CATransaction tüm UIView animasyonları ile çalışır. Animasyondan önce begin dediğiniz sürece ve animasyon kodundan sonra commit.

+0

Hmmm Ne zaman düzenlenmiş sorularımda birbiri ardına çeşitli animasyonlar içeren "zincirlenmiş" bir animasyonum varsa ne olur? – durazno

+0

Ardından, son animasyon kodundan sonra taahhüt bloğunu ekleyin. – Tander

+0

Hmm ama sanırım CAKeyframeAnimation ile gitmek zorundayım çünkü yaptığım şey tam olarak buna ihtiyaç duyuyor. CAKeyframeAnimation ayrıca animasyon kesintiye uğradığında veya CATransition ile birlikte kullanmak zorunda olduğumda tamamlanma blokunun hemen çağrıldığından emin olur mu? – durazno