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 .


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
}

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

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

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

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)


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.


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()
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.