Блоки на 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.