Blocchi su Swift (animateWithDuration: animazioni: completamento :)


102

Ho problemi a far funzionare i blocchi su Swift. Ecco un esempio che ha funzionato (senza blocco di completamento):

UIView.animateWithDuration(0.07) {
    self.someButton.alpha = 1
}

o in alternativa senza la chiusura finale:

UIView.animateWithDuration(0.2, animations: {
    self.someButton.alpha = 1
})

ma una volta che provo ad aggiungere il blocco di completamento, semplicemente non funzionerà:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    self.blurBg.hidden = true
})

Il completamento automatico mi dà completion: ((Bool) -> Void)?ma non sono sicuro di come farlo funzionare. Ho provato anche con la chiusura finale ma ho ricevuto lo stesso errore:

! Could not find an overload for 'animateWithDuration that accepts the supplied arguments

Aggiornamento per Swift 3/4:

// This is how I do regular animation blocks
UIView.animate(withDuration: 0.2) {
    <#code#>
}

// Or with a completion block
UIView.animate(withDuration: 0.2, animations: {
    <#code#>
}, completion: { _ in
    <#code#>
})

Non uso la chiusura finale per il blocco di completamento perché penso che manchi di chiarezza, ma se ti piace puoi vedere la risposta di Trevor di seguito .


1
"Il completamento automatico mi dà il completamento: ((Bool) -> Void)? Ma non sono sicuro di come farlo funzionare" Esattamente quello che dice. Deve essere un blocco che accetta un Bool e restituisce un Void.
matt

Come fai a sapere cosa è ((Bool) -> Void)? è per? Dato che l'ho usato in ObjC prima di sapere che è BOOL finito. Ma come potrebbe saperlo un programmatore veloce?
malhal

Risposte:


202

il parametro di completamento in animateWithDuration accetta un blocco che accetta un parametro booleano. In swift, come nei blocchi Obj C, devi specificare i parametri che una chiusura assume:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    (value: Bool) in
    self.blurBg.hidden = true
})

La parte importante qui è il file (value: Bool) in. Questo dice al compilatore che questa chiusura accetta un valore Bool etichettato e restituisce void.

Per riferimento, se si desidera scrivere una chiusura che restituisce un valore bool, la sintassi sarebbe

{(value: Bool) -> bool in
    //your stuff
}

Può anche essere risolto usando $0per il primo argomento, semplicemente usando la variabile all'interno del blocco, il compilatore capisce che il tuo blocco accetta un argomento.
Può il

1
sintassi del blocco di completamento dat :(
Chris Allinson

41

Il completamento è corretto, la chiusura deve accettare a Bool parametro: (Bool) -> (). Provare

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})

2
Vale la pena notare che questa versione è corretta. Non è necessario scrivere il tipo completo poiché può essere dedotto, quindi tutto ciò che serve è solo menzionare il parametro di chiusura come menzionato qui.
Chuck

29

Il carattere di sottolineatura da solo accanto alla inparola chiave ignorerà l'input

Swift 2

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.hidden = true
})

Swift 3, 4, 5

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.isHidden = true
})

8

C'è la mia soluzione sopra basata sulla risposta accettata sopra. Sfuma una vista e la nasconde una volta quasi invisibile.

Swift 2

func animateOut(view:UIView) {

    UIView.animateWithDuration (0.25, delay: 0.0, options: UIViewAnimationOptions.CurveLinear ,animations: {
        view.layer.opacity = 0.1
        }, completion: { _ in
            view.hidden = true
    })   
}

Swift 3, 4, 5

func animateOut(view: UIView) {

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveLinear ,animations: {
        view.layer.opacity = 0.1
    }, completion: { _ in
        view.isHidden = true
    })
}

4

Ecco qua, questo verrà compilato

Swift 2

UIView.animateWithDuration(0.3, animations: {
    self.blurBg.alpha = 1
}, completion: {(_) -> Void in
    self.blurBg.hidden = true
})

Swift 3, 4, 5

UIView.animate(withDuration: 0.3, animations: {
    self.blurBg.alpha = 1
}, completion: {(_) -> Void in
    self.blurBg.isHidden = true
})

Il motivo per cui ho reso l'area Bool un carattere di sottolineatura è perché non stai usando quel valore, se ne hai bisogno puoi sostituire (_) con (value: Bool)


1

A volte si desidera inserire questo in una variabile per animarlo in modi diversi a seconda della situazione. Per questo hai bisogno

 let completionBlock : (Bool) -> () = { _ in 
 }

Oppure potresti usare l'altrettanto prolisso:

 let completionBlock = { (_:Bool) in 
 }

Ma in ogni caso, devi indicare il Boolda qualche parte.


0

SWIFT 3.x + 4.x

Vorrei fare un aggiornamento e semplificare le cose.

L'esempio seguente è implementato in qualsiasi viewsi nasconda lentamente e quando è completamente trasparente; rimuove se stesso dal genitoreview

okvariabile restituirà sempre truecon la fine dell'animazione.

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.