ios - objective - the swift programming language pdf
Blocks en Swift(animateWithDuration: animaciones: finalizaciĆ³n:) (7)
A veces querrás lanzar esto en una variable para animar de diferentes maneras dependiendo de la situación. Para eso necesitas
let completionBlock : (Bool) -> () = { _ in
}
O podrías usar el igualmente detallado:
let completionBlock = { (_:Bool) in
}
Pero en cualquier caso, tienes que indicar el Bool
alguna parte.
Tengo problemas para hacer que los bloques funcionen en Swift. Aquí hay un ejemplo que funcionó (sin bloque de finalización):
UIView.animateWithDuration(0.07) {
self.someButton.alpha = 1
}
o alternativamente sin el cierre posterior:
UIView.animateWithDuration(0.2, animations: {
self.someButton.alpha = 1
})
pero una vez que trato de agregar el bloque de finalización, simplemente no funciona:
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: {
self.blurBg.hidden = true
})
El autocompletar me da completion: ((Bool) -> Void)?
pero no estoy seguro de cómo hacerlo funcionar. También intenté con el cierre posterior, pero obtuve el mismo error:
! Could not find an overload for ''animateWithDuration that accepts the supplied arguments
Actualización para 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#>
})
No uso el cierre posterior para el bloque de finalización porque creo que carece de claridad, pero si te gusta, entonces puedes ver la respuesta de Trevor a continuación .
Aquí tienes, esto compilará
UIView.animateWithDuration(0.3, animations: {
self.blurBg.alpha = 1
}, completion: {(_) -> Void in
self.blurBg.hidden = true
})
La razón por la que hice que el área Bool sea un guión bajo es porque no usa ese valor, si lo necesita puede reemplazar el (_) con (valor: Bool)
Existe mi solución anterior basada en la respuesta aceptada anteriormente. Se desvanece una vista y la oculta una vez casi invisible.
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
})
}
La finalización es correcta, el cierre debe aceptar un parámetro Bool
: (Bool) -> ()
. Tratar
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { finished in
self.blurBg.hidden = true
})
Underscore por sí mismo junto con la palabra clave in
ignorará la entrada
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { _ in
self.blurBg.hidden = true
})
el parámetro de finalización en animateWithDuration toma un bloque que toma un parámetro booleano. En swift, como en Obj C blocks, debe especificar los parámetros que toma un cierre:
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: {
(value: Bool) in
self.blurBg.hidden = true
})
La parte importante aquí es el (value: Bool) in
. Eso le dice al compilador que este cierre toma un Bool etiquetado ''valor'' y devuelve nulo.
Como referencia, si quisiera escribir un cierre que devolviera un bool, la sintaxis sería
{(value: Bool) -> bool in
//your stuff
}
SWIFT 3.x + 4.x
Me gustaría hacer una actualización y simplificar las cosas.
El siguiente ejemplo se implementa en cualquier view
que se esconde lentamente y cuando es completamente transparente; se elimina de la view
principal
ok
variable ok
siempre devuelve true
con terminación de animación.
alpha = 1
UIView.animate(withDuration: 0.5, animations: {
self.alpha = 0
}) { (ok) in
print("Ended /(ok)")
self.removeFromSuperview()
}