Блоки на 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) -> Void)? Но я не знаю, как заставить его работать» Именно то, что он говорит. Это должен быть блок, который принимает Bool и возвращает Void.
Matt
Как узнать что за ((Bool) -> Void)? для? Поскольку я использовал это в ObjC, прежде чем я знал, что BOOL закончен. Но как быстро узнать об этом?
Malhal 04

Ответы:

202

параметр завершения в animateWithDuration принимает блок, который принимает один логический параметр. В 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
}
Заксуп
источник
Также можно решить, используя $0для первого аргумента, просто используя переменную внутри блока, компилятор выясняет, что ваш блок принимает аргумент.
Кан
1
Синтаксис блока завершения dat :(
Крис Аллинсон
41

Завершение правильно, то затвор должен принять Boolпараметр: (Bool) -> (). Пытаться

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})
Николас Х.
источник
2
Стоит отметить , что эта версия является правильным. Вам не нужно записывать полный тип, так как он может быть выведен, поэтому все, что вам нужно, это просто указать параметр закрытия, упомянутый здесь.
Чак
29

Само подчеркивание рядом с in ключевым словом игнорирует ввод

Swift 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

Это мое решение выше, основанное на принятом выше ответе. Он затемняет вид и скрывает его, когда-то почти невидимым.

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

Свифт 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
    })
}
Jaro
источник
4

Вот и все, это скомпилирует

Swift 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 подчеркиванием, заключается в том, что вы не используете это значение, если оно вам нужно, вы можете заменить (_) на (value: 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()
    }
Тревор
источник