2017-05-07 1 views
0

Das klang einfach, aber ich konnte es nicht herausfinden.Betten Sie eine UIView-Animation in eine Funktion ein, die nach Abschluss der Animation zurückkehren muss

Kontext: Ein VC teilt einer Ansicht mit, dass sie sich selbst animieren soll, und der VC wartet, bis die Animation abgeschlossen ist.

Ich dachte an so etwas wie dies zu tun:

In Viewcontroller:

loadingView.animate() 

In LoadingView (UIView Unterklasse):

animate() -> Bool { 
    UIView.animate(withDuration: 1.0, animations: { 
     self.imageViewCenterYConstraint.constant -= 20 
     self.layoutIfNeeded() 
    }, completion { 
     return true // This line obviously doesn't work. 
    }) 
} 

Ich will nicht den Rest der einschließen Code innerhalb des Abschlussblocks. Der Rest des Codes ist in der VC.

Ich vermute, dass all dies eher mit einem zusätzlichen Abschluss-Handler getan werden sollte, um die Animate Func hinzuzufügen.

PS: Für den Fall, dass Sie eine bessere Lösung/Best Practices kennen, hier ist mehr Kontext: Ich zeige eine Lade-Animation und entfernen Sie es, sobald ich Daten aus dem Netzwerk abgerufen habe. Ich möchte immer auf den Abschluss der Animation warten, bevor sie entfernt wird, selbst wenn die Netzwerkdaten bereits heruntergeladen wurden. Ich möchte die Animation nicht um die Hälfte stoppen.

+0

Ein zusätzlicher Abschluss Block oder ein Delegierter ist ein Weg zu gehen. – Losiowaty

Antwort

1

Sie können nicht von einer Funktion zurückkehren, sobald eine asynchrone Task abgeschlossen ist. (Ok, es könnte möglich sein, aber es ist eine SEHR SCHLECHTE IDEE. Sie müssten den Haupt-Thread blockieren, der darauf wartet, dass die Async-Funktion abgeschlossen wird, was Ihre Benutzeroberfläche einfrieren und dazu führen würde, dass der System-Sprungbrett-Prozess Ihre App beendet wenn es zu lange dauert.)

Sie müssen Ihre Funktion schreiben, um einen Abschlussblock zu nehmen und ihn aufzurufen, sobald die Animation abgeschlossen ist. Etwas wie folgt aus:

animate(completion: (Bool) -> Void) { 
    UIView.animate(withDuration: 1.0, animations: { 
     self.imageViewCenterYConstraint.constant -= 20 
     self.layoutIfNeeded() 
    }, completion { 
     completion(true) 
    }) 
} 

(Ich denke, das ist richtig, aber ich immer noch nicht Schließung Syntax perfekt haben, so könnte es angepasst werden müssen.)

1

Für Ihr Problem Verwendung Schließungen Entkommen zurückzukehren, sobald Animation erfolgt. Schreib-Funktion für die gleiche und dann wird Ihr Code wie folgt aussehen.

func animate(completion: @escaping (Bool) -> Void) { 

    UIView.animate(withDuration: 1.0, animations: { 

     //Do your animation stuff here 
     //self.imageViewCenterYConstraint.constant -= 20 
     //self.layoutIfNeeded() 

    }, completion: {(true) in 

     completion(true) 

    }) 

} 

Sie können diese Methode aufrufen, wie diese

animate { (isDone) in 

    // Animation is completed do your own stuff here 


} 
Verwandte Themen