tutorial the programming objective language curso apple ios swift

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