Swiftでブロックを機能させるのに問題があります。動作する例は次のとおりです(完了ブロックなし):
UIView.animateWithDuration(0.07) {
self.someButton.alpha = 1
}
または、後続のクロージャなしで:
UIView.animateWithDuration(0.2, animations: {
self.someButton.alpha = 1
})
しかし、完了ブロックを追加しようとすると、うまくいきません:
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: {
self.blurBg.hidden = true
})
オートコンプリートによりcompletion: ((Bool) -> Void)?
が得られますが、どのように機能させるかわかりません。トレーリングクロージャも試みましたが、同じエラーが発生しました。
! Could not find an overload for 'animateWithDuration that accepts the supplied arguments
// 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#>
})
完了ブロックには末尾のクロージャーを使用しませんが、それは明確性に欠けると思いますが、気に入った場合は Trevorの答え を見ることができます。
animateWithDurationの完了パラメーターは、1つのブールパラメーターを受け取るブロックを受け取ります。 Swiftでは、Obj Cブロックのように、クロージャーが取るパラメーターを指定する必要があります。
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: {
(value: Bool) in
self.blurBg.hidden = true
})
ここで重要な部分は(value: Bool) in
です。これは、このクロージャーが 'value'というラベルのBoolを取り、voidを返すことをコンパイラーに伝えます。
参考までに、boolを返すクロージャを作成する場合、構文は次のようになります。
{(value: Bool) -> bool in
//your stuff
}
完了は正しく、クロージャーはBool
パラメーターを受け入れる必要があります:(Bool) -> ()
。試して
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { finished in
self.blurBg.hidden = true
})
in
キーワードと一緒にアンダースコア自体が入力を無視します
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { _ in
self.blurBg.hidden = true
})
上記の受け入れられた答えに基づいた上記の私の解決策があります。ビューをフェードアウトし、ほとんど見えなくなったら非表示にします。
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
})
}
どうぞ、これはコンパイルします
UIView.animateWithDuration(0.3, animations: {
self.blurBg.alpha = 1
}, completion: {(_) -> Void in
self.blurBg.hidden = true
})
Boolエリアをアンダースコアにした理由は、その値を使用しないためです。必要な場合は、(_)を(value:Bool)に置き換えることができます
状況に応じてさまざまな方法でアニメーション化するために、変数にこれをスローしたい場合があります。そのためにあなたが必要とする
let completionBlock : (Bool) -> () = { _ in
}
または、同様に詳細なものを使用できます。
let completionBlock = { (_:Bool) in
}
ただし、いずれにしても、Bool
をどこかに指定する必要があります。
Swift 3.x + 4.x
更新を行い、物事を簡素化したいと思います。
以下の例は、view
で実装されており、ゆっくりと隠れていて、完全に透明になっています。親view
から自分自身を削除します
ok
変数は、アニメーション終了時に常にtrue
を返します。
alpha = 1
UIView.animate(withDuration: 0.5, animations: {
self.alpha = 0
}) { (ok) in
print("Ended \(ok)")
self.removeFromSuperview()
}