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.