19

Ich richte die folgende UIView animateWithDuration:-Methode ein, mit der Absicht, meine animationOn BOOL an einem anderen Ort im Programm zu setzen, um diese Endlosschleife zu beenden. Ich hatte den Eindruck, dass der Block completion jedes Mal aufgerufen wird, wenn ein Zyklus der Animation endet, aber das scheint nicht der Fall zu sein.Stoppen Sie eine UIView-Animation mit automatischem Reverse/unendlichen Wiederholungen mit einem BOOL/Completion-Block

Wird der completion-Block jemals in einer sich wiederholenden Animation aufgerufen? Und wenn nicht, gibt es eine andere Möglichkeit, diese Animation von außerhalb dieser Methode zu stoppen?

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

Antwort

45

Der Abschlussblock wird nur aufgerufen, wenn die Animation unterbrochen wird. Zum Beispiel wird es aufgerufen, wenn die App im Hintergrund läuft und wieder in den Vordergrund kommt (via Multitasking). In diesem Fall wird die Animation gestoppt. Sie sollten die Animation neu starten, wenn dies passiert.

Um die Animation stoppen Sie es von der Schicht nach Ansicht entfernen:

[button.layer removeAllAnimations]; 
+0

Das hat nicht funktioniert, fürchte ich. Die Animation wird noch ausgeführt, nachdem die Änderung der Transformation angewendet wurde. (Ich habe '.transform' auf' CGAffineTransformMakeScale (1.0, 1.0) 'gesetzt). – Luke

+0

Ich habe etwas anderes gefunden, das funktionieren könnte. Ich habe meine Antwort aktualisiert. Kannst du das versuchen? –

+0

Oh, du hast es selbst herausgefunden :) Danke, dass du meine Antwort trotzdem angenommen hast –

2

ich das Problem gelöst habe durch [button.layer removeAllAnimations] Aufruf.

+0

Ich habe das müde, aber es funktioniert nicht für mich. Woher kennst du diese Methode in deinem Code? – Supertecnoboff

8

Alt aber eine andere Option.

Sie können auch eine andere Animation einrichten, die sich nicht in der gleichen Ansicht wiederholt. Auf diese Weise können Sie sie auch im aktuellen Status erfassen und mithilfe der Option UIViewAnimationOptionBeginFromCurrentState zurückgeben. Ihr Abschlussblock wird ebenfalls aufgerufen.

-(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

Dies ist ein netterer Ansatz als die andere Lösung, da sie die Animation nahtlos in die Identität zurückbringt. – Nikolozi

1

Gemäß der Dokumentation der View-Klasse Referenz: Wenn Sie eine der Klassenmethoden wie animateWithDuration:delay:options:animations:completion: , wenn die Dauer der negativen Wert oder 0 gesetzt wird, werden die Änderungen vorgenommen, ohne Animation durchführen. so tat ich so etwas die unendliche Animation zu stoppen:

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

Ich denke, das ist besser als alle Animationen aus der Schicht, wie in der vorgeschlagenen Antwort zu entfernen. Beachten Sie, dass dies für alle anderen Klassenanimationsmethoden in der UIView-Klasse gilt.

+0

Das hat bei mir nicht funktioniert. Ich musste removeAllAnimations aufrufen. –

Verwandte Themen