我无法让这些块在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
// 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#>
})
我没有使用尾随闭包作为完成块,因为我认为它缺乏清晰度,但如果你喜欢它,那么你可以看到Trevor's answer below。
答案 0 :(得分:197)
animateWithDuration中的completion参数采用一个带有一个布尔参数的块。在swift中,就像在Obj C块中一样,您必须指定闭包所需的参数:
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: {
(value: Bool) in
self.blurBg.hidden = true
})
这里的重要部分是(value: Bool) in
。这告诉编译器这个闭包采用Bool标记的&#39;值&#39;并返回void。
作为参考,如果你想写一个返回bool的闭包,语法将是
{(value: Bool) -> bool in
//your stuff
}
答案 1 :(得分:39)
完成正确,闭包必须接受Bool
参数:(Bool) -> ()
。尝试
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { finished in
self.blurBg.hidden = true
})
答案 2 :(得分:29)
与in
关键字一起单独调整会忽略输入
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { _ in
self.blurBg.hidden = true
})
答案 3 :(得分:8)
根据上面接受的答案,上面有我的解决方案。它淡出一个视图并隐藏它几乎看不见。
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
})
}
答案 4 :(得分:4)
在这里,这将编译
UIView.animateWithDuration(0.3, animations: {
self.blurBg.alpha = 1
}, completion: {(_) -> Void in
self.blurBg.hidden = true
})
我将Bool区域作为下划线的原因是因为您没有使用该值,如果您需要它,您可以将(_)替换为(value:Bool)
答案 5 :(得分:1)
有时你想把它放在一个变量中,根据情况以不同的方式制作动画。为此你需要
let completionBlock : (Bool) -> () = { _ in
}
或者你可以使用同样详细的:
let completionBlock = { (_:Bool) in
}
但无论如何,你必须在某处指明Bool
。
答案 6 :(得分:0)
SWIFT 3.x + 4.x
我想进行更新并简化操作。
以下示例在任何view
实施,它隐藏得很慢,而且完全透明;从父view
ok
变量将始终返回动态终止的true
。
alpha = 1
UIView.animate(withDuration: 0.5, animations: {
self.alpha = 0
}) { (ok) in
print("Ended \(ok)")
self.removeFromSuperview()
}