2016-05-19 19 views
1

Ich habe die folgende kleine Funktion, die zwei primäre Aktionen enthält, die ich auftreten möchte. Eine Drei-Sekunden-Animation und nach Abschluss dieser Animation ein weiterer Funktionsaufruf. Es passiert jedoch, dass die Codezeile, die eine andere Funktion aufruft, ausgeführt wird, bevor die UIView-Animation abgeschlossen wurde.UIView animiert mit Abschluss Block funktioniert nicht

Ich habe andere ähnliche Beiträge auf der Suche nach der Lösung untersucht, aber keine der Lösungen hat mein Puzzle gelöst. Was mache ich falsch im Abschlussblock, um diese Aktionen zu einer Sequenz und nicht gleichzeitig zu machen?

+0

Ich denke, dass dies passiert, weil progressBar auch Animation haben, so denke ich, dass Abschlussblock ausgeführt werden, sobald Animation Block ausgeführt. Aber die Funktion läuft schnell, weil der Fortschrittsbalken im Animationsprozess ist. –

+0

Was @ChathurangaSilva sagt, ist korrekt. Warum verwenden Sie dafür einen UIView-Animationsblock? Die Fortschrittsleiste hat eigene Animationen. –

Antwort

3

dass ProgressBar Angenommen ist ein UIProgressView, die setProgress Verfahren animiert selbst und braucht nicht in einem Anruf UIView.animateWithDuration enthalten sein.

Das bedeutet, die setProgress Animation ist wahrscheinlich länger als die Dauer, die Sie in dem UIView.animateWithDuration Anruf setzen sind, so self.switchToFastState() genannt wird, wenn die UIView Animation ends- bevor die setProgress Animation abgeschlossen ist.

Lösungen

  1. die Dauer ändern. Sie können dies umgehen, indem Sie die Dauer der setProgress Animation finden/erraten und diese als Ihre UIView Animationsdauer verwenden. Dies sollte das Verhalten nachahmen, das Sie anstreben.

  2. Ändern Sie die Dauer, aber verwenden Sie GCD. Dies ist die gleiche Idee wie oben, verwendet jedoch nicht die UIView Animationsmethode. Sie können this question für die Verwendung von GCD sehen.

  3. NSTimer oder Subclassing. Es gibt Lösungen here, die NSTimer oder Unterklasse UIProgressView verwenden.

+0

Das ist, worüber ich spreche! erklärte die Situation klar. –

+0

Große Antwort, aber ich denke, Lösung # 1 ist super Hacky und sollte entfernt werden. Benutze einfach GCD oder NSTimer dafür! –

+0

Vielen Dank für den Versuch, meine Frage zu beantworten. Der Grund, warum ich NSTimer nicht in Verbindung mit der Fortschrittsanzeige verwenden möchte, liegt darin, dass es zu einer sehr ruckartigen Erfahrung führt, da der Fortschritt von links nach rechts schwankt. – zeeple

0

Ich bin nicht sicher, ob dies die besten Lösung ist, aber das ist, was ich am Ende mit gehen:

 ProgressBar.progress = 1.0 
     UIView.animateWithDuration(Double(normalDuration), animations: {() -> Void in 
      self.ProgressBar.layoutIfNeeded() 
      }, completion: { (_) -> Void in 
       self.switchToFastState() 
     }) 

Diese Lösung die setProgress entfernt von den (das animiert werden kann) Animationsblock und dies ermöglicht die UIView-Animation ohne Unterbrechung auszuführen.