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


Я не использую трейлинг-закрытие для блока завершения, потому что я думаю, что ему не хватает ясности, но если вам это нравится, вы можете увидеть ответ Тревора ниже.

470   7  

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

    Ничего не найдено.