web-dev-qa-db-ja.com

Swift(animateWithDuration:animations:completion :)のブロック

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

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

完了ブロックには末尾のクロージャーを使用しませんが、それは明確性に欠けると思いますが、気に入った場合は Trevorの答え を見ることができます。

101
manolosavi

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
}
198
Zaksoup

完了は正しく、クロージャーはBoolパラメーターを受け入れる必要があります:(Bool) -> ()。試して

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

inキーワードと一緒にアンダースコア自体が入力を無視します

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

上記の受け入れられた答えに基づいた上記の私の解決策があります。ビューをフェードアウトし、ほとんど見えなくなったら非表示にします。

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

どうぞ、これはコンパイルします

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

Boolエリアをアンダースコアにした理由は、その値を使用しないためです。必要な場合は、(_)を(value:Bool)に置き換えることができます

4
Kris Gellci

状況に応じてさまざまな方法でアニメーション化するために、変数にこれをスローしたい場合があります。そのためにあなたが必要とする

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

または、同様に詳細なものを使用できます。

 let completionBlock = { (_:Bool) in 
 }

ただし、いずれにしても、Boolをどこかに指定する必要があります。

1
Dan Rosenstark

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()
    }
0
Trevor