web-dev-qa-db-de.com

So brechen Sie die UIView-Block-basierte Animation ab?

Ich habe viele SO - Sachen und in Apples Referenzen gesucht, aber mein Problem noch immer nicht lösen können.

Was ich habe:

  1. bildschirm mit 2 UIImageViews und 2 UIB-Tasten
  2. 2 Arten von Animationen:
    2.1. Zuerst wird das Bild vergrößert, dann wird jedes Bild in viewDidLoad .__ nacheinander und nur einmal heruntergefahren 2.2. Zweitens: Wenn eine Taste gedrückt wird (die benutzerdefinierte Schaltfläche, die innerhalb jeder UIImageView-Ansicht versteckt ist), wird die Animation der entsprechenden UIImageView-Animation ausgelöst - nur eine, nicht beide - (auch vergrößern, dann abwärts).
  3. Da ich für iOS4 + schreibe, wird mir empfohlen, blockbasierte Animationen zu verwenden!

Was ich brauche:

Wie kann ich die laufende Animation abbrechen? Es ist mir gelungen, den Vorgang abzubrechen, außer der letzten ...: / Hier ist mein Code-Snippet:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

Irgendwie funktioniert das smallLetter UIImageView nicht richtig, denn wenn Sie (durch die Schaltfläche) gedrückt werden, bricht bigLetter die Animationen richtig ab ... Vielen Dank im Voraus :)

EDIT: Ich habe diese Lösung verwendet, hatte aber immer noch Probleme mit der Verkleinerung von smallLetter UIImageView - überhaupt nicht abgebrochen ... Lösung

EDIT2: Ich habe dies am Anfang von next/prev hinzugefügt:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

problem bleibt ...:/keine Ahnung, wie die letzte Animation für Buchstaben in der Animationskette unterbrochen wird

69
raistlin

Sie können alle Animationen in einer Ansicht stoppen, indem Sie Folgendes aufrufen:

[view.layer removeAllAnimations];

(Sie müssen das QuartzCore-Framework importieren, um Methoden für view.layer aufzurufen).

Wenn Sie eine bestimmte Animation und nicht alle Animationen stoppen möchten, ist es am besten, CAAnimations anstelle der UIView-Animationshilfemethoden explizit zu verwenden. Dann haben Sie eine detailliertere Steuerung und können Animationen explizit anhand ihres Namens anhalten.

Die Dokumentation zur Apple Core Animation finden Sie hier:

https://developer.Apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html

136
Nick Lockwood

Verwenden Sie für iOS 10 UIViewPropertyAnimator zum Animieren. Es bietet Methoden zum Starten, Stoppen und Anhalten von UIView-Animationen. 

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)
28
Hari Kunwar

Ich würde zu Nicks Antwort hinzufügen, dass die nächste Idee von removeAllAnimations sehr praktisch ist.

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];
2
Gaston

Sie können dies (in Swift) versuchen: 

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

Hinweis: Sie können bei Bedarf auch Code zwischen diesen beiden Aufrufen eingeben, beispielsweise: 

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
0
iAmcR