Blok di Swift (animateWithDuration: animasi: penyelesaian :)

102

Saya mengalami masalah saat membuat blok berfungsi di Swift. Berikut adalah contoh yang berhasil (tanpa blok penyelesaian):

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

atau sebagai alternatif tanpa penutupan akhir:

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

tetapi begitu saya mencoba menambahkan blok penyelesaian, itu tidak akan berhasil:

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

Pelengkapan otomatis memberi saya completion: ((Bool) -> Void)?tetapi tidak yakin bagaimana cara membuatnya bekerja. Juga mencoba dengan penutupan tambahan tetapi mendapatkan kesalahan yang sama:

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

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

Saya tidak menggunakan penutupan trailing untuk blok penyelesaian karena menurut saya kurang jelas, tetapi jika Anda suka maka Anda dapat melihat jawaban Trevor di bawah ini .

manolosavi.dll
sumber
1
"Pelengkapan otomatis memberi saya penyelesaian: ((Bool) -> Void)? Tapi tidak yakin bagaimana membuatnya bekerja" Persis seperti yang dikatakan. Ini harus menjadi blok yang mengambil Bool dan mengembalikan Void.
matt
Bagaimana Anda tahu apa ((Bool) -> Void)? adalah untuk? Karena saya telah menggunakan ini di ObjC sebelum saya tahu itu BOOL selesai. Tapi bagaimana seorang pembuat kode cepat tahu?
malhal

Jawaban:

202

parameter penyelesaian di animateWithDuration mengambil satu blok yang mengambil satu parameter boolean. Secara cepat, seperti di blok Obj C, Anda harus menentukan parameter yang diperlukan penutupan:

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

Bagian penting di sini adalah (value: Bool) in. Itu memberi tahu kompiler bahwa closure ini mengambil Bool berlabel 'value' dan mengembalikan void.

Sebagai referensi, jika Anda ingin menulis closure yang mengembalikan bool sintaksnya

{(value: Bool) -> bool in
    //your stuff
}
Zaksoup
sumber
Dapat juga diselesaikan dengan menggunakan $0for argumen pertama, hanya dengan menggunakan variabel di dalam blok, kompilator mengetahui bahwa blok Anda menerima sebuah argumen.
Bisa
1
sintaks blok penyelesaian dat :(
Chris Allinson
41

Selesai sudah benar, penutupan harus menerima Boolparameter: (Bool) -> (). Mencoba

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})
Nicholas H.
sumber
2
Perlu dicatat bahwa versi ini benar. Anda tidak perlu menulis tipe lengkapnya karena bisa disimpulkan, jadi yang Anda butuhkan hanyalah menyebutkan parameter closure seperti yang disebutkan di sini.
Chuck
29

Menggarisbawahi dengan sendirinya di samping inkata kunci akan mengabaikan masukan

Cepat 2

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

Cepat 3, 4, 5

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

Ada solusi saya di atas berdasarkan jawaban yang diterima di atas. Ini memudarkan pandangan dan menyembunyikannya sekali hampir tidak terlihat.

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

Cepat 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
sumber
4

Ini dia, ini akan dikompilasi

Cepat 2

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

Cepat 3, 4, 5

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

Alasan saya menjadikan area Bool garis bawah adalah karena Anda tidak menggunakan nilai itu, jika Anda membutuhkannya Anda dapat mengganti (_) dengan (value: Bool)

Kris Gellci
sumber
1

Terkadang Anda ingin memasukkan ini ke dalam variabel untuk dianimasikan dengan cara yang berbeda tergantung pada situasinya. Untuk itu yang Anda butuhkan

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

Atau Anda bisa menggunakan kata-kata yang sama bertele-tele:

 let completionBlock = { (_:Bool) in 
 }

Tetapi bagaimanapun juga, Anda harus menunjukkan Boolsuatu tempat.

Dan Rosenstark
sumber
0

SWIFT 3.x + 4.x

Saya ingin memperbarui dan menyederhanakan semuanya.

Contoh di bawah ini diterapkan di semua viewtempat yang bersembunyi dengan lambat dan saat transparan sepenuhnya; menghapusnya sendiri dari orang tuaview

okvariabel akan selalu kembali truedengan penghentian animasi.

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