19

Konfiguruję następującą metodę UIView animateWithDuration:, z zamiarem ustawienia mojego animationOn BOOL w innym miejscu w programie, aby anulować to nieskończone zapętlone powtórzenie. Miałem wrażenie, że blok completion będzie wywoływany za każdym razem, gdy skończy się cykl animacji, ale nie wydaje się, żeby tak było.Zatrzymaj animację UIView z automatycznym powrotem/nieskończoną liczbą powtórzeń z blokiem BOOL/ukończenia

Czy blok completion kiedykolwiek wywołał powtarzającą się animację? A jeśli nie, czy istnieje inny sposób na zatrzymanie tej animacji spoza tej metody?

- (void) animateFirst: (UIButton *) button 
{ 
    button.transform = CGAffineTransformMakeScale(1.1, 1.1); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 
         if (!animationOn) { 
          [UIView setAnimationRepeatCount: 0]; 
         } 
    }]; 
} 

Odpowiedz

45

Blok zakończenia zostanie wywołany tylko wtedy, gdy animacja zostanie przerwana. Na przykład jest wywoływana, gdy aplikacja idzie w tle i wraca na pierwszy plan (poprzez wielozadaniowość). W takim przypadku animacja zostanie zatrzymana. Powinieneś ponownie uruchomić animację, gdy to się stanie.

Aby zatrzymać animację można go usunąć z warstwy widoku za:

[button.layer removeAllAnimations]; 
+0

To nie zadziałało, obawiam się. Animacja wciąż trwa po zastosowaniu zmiany w transformacji. (Ustawiłem '.transform' na' CGAffineTransformMakeScale (1.0, 1.0) '). – Luke

+0

Znalazłem coś, co może zadziałać. Zaktualizowałem swoją odpowiedź. Czy możesz tego spróbować? –

+0

Och, wymyśliłeś to sam :) Dzięki za zaakceptowanie mojej odpowiedzi i tak –

2

mam rozwiązać problem poprzez wywołanie [button.layer removeAllAnimations].

+0

Zmęczyłem to, ale to nie działa dla mnie. Gdzie w swoim kodzie nazywasz tę metodę? – Supertecnoboff

8

Stara, ale inna opcja.

Można również ustawić inną animację, która nie jest powtarzana w tym samym widoku, w ten sposób można również przechwycić ją w bieżącym stanie i przywrócić ją do stanu z użyciem opcji UIViewAnimationOptionBeginFromCurrentState. Twój blok zakończenia jest również wywoływany.

-(void)someEventSoStop 
{ 
    button.transform = CGAffineTransformMakeScale(1.0, 1.0); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 

        }]; 
} 
+0

To ładniejsze podejście niż inne rozwiązanie, ponieważ płynnie przywraca animację do tożsamości. – Nikolozi

1

Zgodnie z dokumentacją odniesienia Zobacz klasy: Jeśli użyto żadnej z metod klasy takie jak animateWithDuration:delay:options:animations:completion: jeżeli czas jest ustawiony na wartość ujemną lub 0, zmiany dokonywane są bez wykonywania animacji. więc zrobiłem coś takiego, aby zatrzymać nieskończone animację:

[UIView animateWithDuration:0.0 animations:^{ 
     button.layer.affineTransform = CGAffineTransformIdentity; 
    }]; 

Myślę, że to lepsze niż wyprowadzenie wszystkich animacji z warstwy jak w sugerowanej odpowiedzi. Należy zauważyć, że dotyczy to wszystkich innych metod animacji klas w klasie UIView.

+0

To nie działa dla mnie. Musiałem zadzwonić do removeAllAnimations. –

Powiązane problemy