Блоки на Swift (animateWithDuration: анімація: завершення :)


102

У мене виникають проблеми з тим, щоб блоки працювали на 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#>
})

Я не використовую останнє закриття для блоку завершення, тому що я думаю, що йому не вистачає ясності, але якщо вам це подобається, ви можете побачити відповідь Тревора нижче .


1
"Автозаповнення дає мені завершення: ((Bool) -> Пустота), але не впевнений, як змусити його працювати" Точно те, що написано. Це повинен бути блок, який приймає Bool і повертає порожнечу.
мат

Звідки ви знаєте, що таке ((Bool) -> void)? для? Оскільки я використовував це в ObjC, перш ніж я знав, що закінчено BOOL. Але як би знав швидкий кодер?
мальхал

Відповіді:


202

параметр завершення в animateWithDuration приймає блок, який приймає один булевий параметр. Швидко, як у блоках Obj C, ви повинні вказати параметри, які потребує закриття:

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

Тут важлива частина (value: Bool) in. Це повідомляє компілятору, що це закриття приймає Bool з позначкою "value" і повертає недійсним.

Для довідки, якби ви хотіли написати закриття, яке повернуло bool, був би синтаксис

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

Також можна вирішити, використовуючи $0для першого аргументу, просто використовуючи змінну всередині блоку, компілятор з'ясовує, що ваш блок приймає аргумент.
Може

1
дат

41

Завершення правильно, то затвор повинен прийняти Boolпараметр: (Bool) -> (). Спробуйте

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

2
Варто зазначити , що ця версія є правильним. Вам не потрібно виписувати повний тип, оскільки він може зробити висновок, тому все, що вам потрібно, це лише згадати параметр закриття, як згадується тут.
Чак

29

Підкреслення самостійно поряд із inключовим словом ігнорує введення даних

Швидкий 2

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

Швидкий 3, 4, 5

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

8

Вище є моє рішення на основі прийнятої відповіді вище. Це згасає погляд і ховає його колись майже непомітним.

Швидкий 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
    })   
}

Швидкий 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

Ось ви йдете, це складеться

Швидкий 2

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

Швидкий 3, 4, 5

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

Причиною того, що я зробив область Bool підкресленням є те, що ви не використовуєте це значення, якщо вам це потрібно, ви можете замінити (_) на (значення: Bool)


1

Іноді ви хочете кинути це у змінну, щоб анімувати різними способами залежно від ситуації. Для цього вам потрібно

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

Або ви можете використовувати однаково багатослівний:

 let completionBlock = { (_:Bool) in 
 }

Але в будь-якому випадку вам доведеться Boolдесь вказати .


0

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()
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.