在Swift上的块(animateWithDuration:animation:完成:)

我在使用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

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标签的“值”,并返回void。

作为参考,如果你想写一个闭包,返回一个bool的语法将是

 {(value: Bool) -> bool in //your stuff } 

完成是正确的,闭包必须接受一个Bool参数: (Bool) -> () 。 尝试

 UIView.animateWithDuration(0.2, animations: { self.blurBg.alpha = 1 }, completion: { finished in self.blurBg.hidden = true }) 

in关键字一起下划线将忽略input

 UIView.animateWithDuration(0.2, animations: { self.blurBg.alpha = 1 }, completion: { _ in self.blurBg.hidden = true }) 

上面是基于上面接受的答案我的解决scheme。 它淡出一个视野,隐藏一次几乎看不见的东西。

 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)replace(_)

有时候你想把它放在一个variables中,根据情况用不同的方式来设置animation。 为此你需要

  let completionBlock : (Bool) -> () = { _ in } 

或者你可以使用同样详细的:

  let completionBlock = { (_:Bool) in } 

但无论如何,你必须在某处指明Bool