在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
。