Блоки на Swift (animateWithDuration: animations:completion:)
у меня возникли проблемы с тем, чтобы блоки работали на 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#>
})
Я не использую трейлинг-закрытие для блока завершения, потому что я думаю, что ему не хватает ясности, но если вам это нравится, вы можете увидеть ответ Тревора ниже.
7 ответов:
параметр завершения в animateWithDuration принимает блок, который принимает один параметр типа boolean. В swift, как и в блоках Obj C, вы должны указать параметры, которые принимает закрытие:
UIView.animateWithDuration(0.2, animations: { self.blurBg.alpha = 1 }, completion: { (value: Bool) in self.blurBg.hidden = true })важная часть здесь
(value: Bool) in. Это говорит компилятору, что это закрытие принимает Bool с надписью "value" и возвращает void.Для справки, если вы хотите написать закрытие, которое возвращает bool синтаксис будет
{(value: Bool) -> bool in //your stuff }
завершение правильно, закрытие должно принять :
(Bool) -> (). ПопробуйUIView.animateWithDuration(0.2, animations: { self.blurBg.alpha = 1 }, completion: { finished in self.blurBg.hidden = true })
подчеркивание само по себе рядом с
inключевое слово будет игнорировать входUIView.animateWithDuration(0.2, animations: { self.blurBg.alpha = 1 }, completion: { _ in self.blurBg.hidden = true })
есть мое решение выше на основе принятого ответа выше. Он исчезает из вида и скрывает его, когда-то почти невидимый.
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 }) }
здесь вы идете, это будет составлять
UIView.animateWithDuration(0.3, animations: { self.blurBg.alpha = 1 }, completion: {(_) -> Void in self.blurBg.hidden = true })причина, по которой я сделал область Bool подчеркиванием, заключается в том, что вы не используете это значение, если вам это нужно, вы можете заменить (_) на (value : Bool)
иногда вы хотите бросить это в переменную, чтобы анимировать по-разному в зависимости от ситуации. Для этого вам нужно
let completionBlock : (Bool) -> () = { _ in }или вы могли бы использовать столь же многословен:
let completionBlock = { (_:Bool) in }но в любом случае, вы должны указать
Boolкуда-то.
SWIFT 3.х + 4.x
Я хотел бы сделать обновление и упростить вещи.
пример ниже реализован в любом
viewон скрывается медленно и когда он полностью прозрачен; удаляет его самостоятельно от родителяview
okпеременная всегда возвращаетtrueС прекращением анимации.alpha = 1 UIView.animate(withDuration: 0.5, animations: { self.alpha = 0 }) { (ok) in print("Ended \(ok)") self.removeFromSuperview() }
Comments