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

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()
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.