Blöcke auf Swift (animateWithDuration: Animationen: Fertigstellung :)

102

Ich habe Probleme damit, dass die Blöcke auf Swift funktionieren. Hier ist ein Beispiel, das funktioniert hat (ohne Abschlussblock):

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

oder alternativ ohne den nachlaufenden Verschluss:

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

Aber wenn ich einmal versuche, den Abschlussblock hinzuzufügen, funktioniert es einfach nicht mehr:

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

Die automatische Vervollständigung gibt mir completion: ((Bool) -> Void)?aber nicht sicher, wie es funktioniert. Auch mit Trailing Closure versucht, bekam aber den gleichen Fehler:

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

Update für 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#>
})

Ich verwende den nachfolgenden Verschluss nicht für den Abschlussblock, weil ich denke, dass er nicht klar genug ist, aber wenn es Ihnen gefällt, können Sie Trevors Antwort unten sehen .

Manolosavi
quelle
1
"Die automatische Vervollständigung gibt mir den Abschluss: ((Bool) -> Void)? Aber nicht sicher, wie es funktioniert" Genau das, was es sagt. Dies muss ein Block sein, der einen Bool nimmt und eine Leere zurückgibt.
Matt
Woher weißt du was die ((Bool) -> Void)? ist für? Da ich dies in ObjC verwendet habe, bevor ich weiß, dass es BOOL fertig ist. Aber wie würde ein schneller Programmierer es wissen?
Malhal

Antworten:

202

Der Vervollständigungsparameter in animateWithDuration verwendet einen Block, der einen booleschen Parameter verwendet. In Swift, wie in Obj C-Blöcken, müssen Sie die Parameter angeben, die ein Abschluss benötigt:

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

Der wichtige Teil hier ist die (value: Bool) in. Dies teilt dem Compiler mit, dass dieser Abschluss einen Bool mit der Bezeichnung 'value' verwendet und void zurückgibt.

Wenn Sie als Referenz einen Abschluss schreiben möchten, der einen Bool zurückgibt, lautet die Syntax

{(value: Bool) -> bool in
    //your stuff
}
Zaksoup
quelle
Kann auch gelöst werden, indem $0für das erste Argument nur die Variable innerhalb des Blocks verwendet wird. Der Compiler stellt fest, dass Ihr Block ein Argument akzeptiert.
Kann
1
Syntax des Datenabschlussblocks :(
Chris Allinson
41

Der Abschluss ist korrekt, der Abschluss muss einen BoolParameter akzeptieren : (Bool) -> (). Versuchen

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})
Nicholas H.
quelle
2
Es ist erwähnenswert, dass diese Version ist richtig. Sie müssen nicht den vollständigen Typ ausschreiben, da er abgeleitet werden kann. Sie müssen also nur den hier erwähnten Abschlussparameter erwähnen.
Chuck
29

Ein Unterstrich neben dem inSchlüsselwort ignoriert die Eingabe

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
})
Dan Greenfield
quelle
8

Es gibt meine Lösung oben basierend auf der oben akzeptierten Antwort. Es blendet eine Ansicht aus und verbirgt sie einmal fast unsichtbar.

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
    })
}
Jaro
quelle
4

Los geht's, das wird kompiliert

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
})

Der Grund, warum ich den Bool-Bereich zum Unterstrich gemacht habe, ist, dass Sie diesen Wert nicht verwenden. Wenn Sie ihn benötigen, können Sie das (_) durch (value: Bool) ersetzen.

Kris Gellci
quelle
1

Manchmal möchten Sie dies in eine Variable werfen, um sie je nach Situation auf unterschiedliche Weise zu animieren. Dafür brauchst du

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

Oder Sie könnten das ebenso ausführliche verwenden:

 let completionBlock = { (_:Bool) in 
 }

Aber auf jeden Fall müssen Sie das Boolirgendwo angeben .

Dan Rosenstark
quelle
0

SWIFT 3.x + 4.x.

Ich möchte ein Update machen und die Dinge vereinfachen.

Das folgende Beispiel ist in jedem viewFall implementiert, in dem es sich langsam versteckt und wenn es vollständig transparent ist. entfernt es selbst vom Elternteilview

okDie Variable wird immer truemit Beendigung der Animation zurückgegeben.

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }
Trevor
quelle