Come attendere fino a un’animazione è finito in Swift?

Cerco di lasciare un pulsante “shake” prima la domanda successiva del mio quiz sta per caricare.

L’animazione appare come

var timer = NSTimer()
    UIView.animateWithDuration(0.1, animations: {
        self.IMGVIEWcat.center = CGPointMake(self.IMGVIEWcat.center.x + 2, self.IMGVIEWcat.center.y)
    })
    UIView.animateWithDuration(0.2, animations: {
        self.IMGVIEWcat.center = CGPointMake(self.IMGVIEWcat.center.x - 4, self.IMGVIEWcat.center.y)
    })
    UIView.animateWithDuration(0.3, animations: {
            self.IMGVIEWcat.center = CGPointMake(self.IMGVIEWcat.center.x + 2, self.IMGVIEWcat.center.y)
    })

Dopo di che la seguente funzione viene chiamata

    func QueryInformations(){
        println("QueryInformationsStart")
        self.ActivityIndicator.hidden = false
        ObjectIDsArrayCount = ObjectIDsArray.count
        var RandomQuestion = Int(arc4random_uniform(ObjectIDsArray.count + 0))
        var QuestionID:String = ObjectIDsArray[RandomQuestion]
        var query : PFQuery = PFQuery(className: "AddonQuiz")
        query.getObjectInBackgroundWithId(QuestionID){
            (ObjectHolder : PFObject!, error : NSError!) -> Void in
...

Ora inizia l’animazione, ma immediata la domanda successiva è caricato, c’è qualche facile attendere per un principiante per implementare un “in attesa” fino a quando l’animazione è fatto?

Ho provato a impostare

var complet == true 

Nell’animazione

E in funzione di query

if complet = true {....

Ma questo non ha funzionato per me, inoltre ho trovato alcune informazioni sul gestore di completamento, ma non funziona nel mio codice.

  • if complet = true {...} non è ciò che si desidera utilizzare. Utilizzare if complet == true {...} invece. Dal modo in cui si dovrebbe usare il completion blocco alla fine dell’animazione.
  • vero 😉 in codice era == ma la sua ancora non sia stato di aiuto



2 Replies
  1. 9

    Se si desidera utilizzare il completion blocco alla fine dell’animazione, si dovrebbe utilizzare costrutti con il delay e options argomenti pure.

    UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: { 
    //put here the code you would like to animate
        self.IMGVIEWcat.center = CGPointMake(self.IMGVIEWcat.center.x + 2, self.IMGVIEWcat.center.y)
    
    }, completion: {(finished:Bool) in
    //the code you put here will be compiled once the animation finishes
        QueryInformations() 
    })
    • ottenere un errore “}, completamento: {” ‘Bool’ non è un Sottotipo di ‘()’
    • Mi dispiace, prova di nuovo. Ho modificato il codice.
    • grazie ora funziona :)!
    • Contento che hai capito di lavoro! è molto importante capire il options: nil blocco. Invece di nil si potrebbe utilizzare UIViewAnimationOptions.CurveLinear o UIViewAnimationOptions.CurveEaseOut. Queste impostazioni modificare il modo in cui l’animazione si comporta. Se si utilizza l’ultimo l’animazione inizierà rapidamente e si rallenta come l’animazione completa.
    • Che cosa si intende per UIViewAnimationOptions.CurveLinear o UIViewAnimationOptions.CurveEaseOut
    • Check out la mia cura rispondere.
    • Cerchiamo di continuare questa discussione in chat.

  2. 1

    Utilizzare il completion blocco della funzione che si sta chiamando:

    UIView.animateWithDuration(0.3, animations: {
            self.IMGVIEWcat.center = CGPointMake(self.IMGVIEWcat.center.x + 2, self.IMGVIEWcat.center.y)
    }, completion: {(finished:Bool) in
      QueryInformations()
    })

Lascia un commento