Swift'deki Bloklar (animateWithDuration: animasyonlar: tamamlama :)


102

Blokları Swift üzerinde çalıştırmada sorun yaşıyorum. İşte işe yarayan bir örnek (tamamlama bloğu olmadan):

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

veya alternatif olarak takip eden kapatma olmadan:

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

ancak tamamlama bloğunu eklemeye çalıştığımda çalışmıyor:

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

Otomatik tamamlama bana veriyor completion: ((Bool) -> Void)?ama nasıl çalıştırılacağından emin değilim. Ayrıca sondaki kapanışla denendi ancak aynı hatayı aldım:

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

Swift 3/4 güncellemesi:

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

Tamamlama bloğu için takip eden kapatmayı kullanmıyorum çünkü netlikten yoksun olduğunu düşünüyorum, ancak beğenirseniz, aşağıda Trevor'ın cevabını görebilirsiniz .


1
"Otomatik tamamlama bana tamamlama sağlıyor: ((Bool) -> Void)? Ama nasıl çalışmasını sağlayacağımı bilmiyorum" Tam olarak ne diyor. Bu, bir Bool alan ve bir Void döndüren bir blok olmalıdır.
mat

((Bool) -> Void) 'in ne olduğunu nasıl anlarsınız? için? Bunu ObjC'de kullandığım için BOOL'un bittiğini bilmeden önce. Ama hızlı bir kodlayıcı nasıl bilebilir?
malhal

Yanıtlar:


202

animateWithDuration'daki tamamlama parametresi, bir boole parametresi alan bir blok alır. Hızlıda, Obj C bloklarında olduğu gibi, bir kapatmanın alacağı parametreleri belirtmelisiniz:

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

Burada önemli olan kısım (value: Bool) in. Bu, derleyiciye bu kapatmanın 'değer' etiketli bir Bool aldığını ve void döndürdüğünü söyler.

Referans için, bool döndüren bir kapanış yazmak isterseniz sözdizimi şöyle olacaktır:

{(value: Bool) -> bool in
    //your stuff
}

$0İlk argüman için sadece bloğun içindeki değişkeni kullanarak da çözülebilir , derleyici bloğunuzun bir argüman kabul ettiğini anlar.
Can

1
dat tamamlama blok sözdizimi :(
Chris Allinson

41

Tamamlama kapak bir kabul etmek zorundadır, doğru Boolparametresi: (Bool) -> (). Deneyin

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})

2
Bu sürüm fazlalaştı olduğunu doğru. Çıkarılabileceği için tam türü yazmanıza gerek yoktur, bu nedenle tek ihtiyacınız olan, burada belirtildiği gibi sadece kapanış parametresinden bahsetmektir.
Chuck

29

inAnahtar kelimenin yanında tek başına alt çizgi , girişi yok sayacaktır

Swift 2

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

Hızlı 3, 4, 5

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

8

Yukarıda kabul edilen cevaba dayanan çözümüm var. Bir görüntüyü ortadan kaldırır ve neredeyse görünmez hale getirir.

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

Hızlı 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

İşte gidiyorsun, bu derlenecek

Swift 2

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

Hızlı 3, 4, 5

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

Bool alanını bir alt çizgi yapmamın nedeni, bu değeri kullanmamanızdır, eğer ihtiyacınız olursa (_) 'i (değer: Bool) ile değiştirebilirsiniz.


1

Bazen duruma bağlı olarak farklı şekillerde canlandırmak için bunu bir değişkene atmak istersiniz. Bunun için ihtiyacın var

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

Ya da eşit derecede ayrıntılı olanı kullanabilirsiniz:

 let completionBlock = { (_:Bool) in 
 }

Ama her durumda, bir yeri belirtmek zorundasın Bool.


0

SWIFT 3.x + 4.x

Bir güncelleme yapmak ve işleri basitleştirmek istiyorum.

Aşağıdaki örnek, viewyavaşça saklanan ve tamamen şeffaf olduğu zaman uygulanmaktadır ; kendini ebeveynden kaldırırview

okdeğişken her zaman trueanimasyon sonlandırma ile döner .

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.