![](/img/trans.png)
[英]Completion block in (animateWithDuration:animations:completion:) is unpredictably delayed
[英]Blocks on Swift (animateWithDuration:animations:completion:)
我在使块在 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 的答案。
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.animate(withDuration: 0.2, animations: {
self.blurBg.alpha = 1
}, completion: { finished in
self.blurBg.hidden = true
})
与in
关键字一起单独使用下划线将忽略输入
斯威夫特 2
UIView.animateWithDuration(0.2, animations: {
self.blurBg.alpha = 1
}, completion: { _ in
self.blurBg.hidden = true
})
斯威夫特 3、4、5
UIView.animate(withDuration: 0.2, animations: {
self.blurBg.alpha = 1
}, completion: { _ in
self.blurBg.isHidden = true
})
基于上面接受的答案,上面有我的解决方案。 它淡出一个视图并将它隐藏起来,一旦几乎不可见。
斯威夫特 2
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
})
}
斯威夫特 3、4、5
func animateOut(view: UIView) {
UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveLinear ,animations: {
view.layer.opacity = 0.1
}, completion: { _ in
view.isHidden = true
})
}
给你,这将编译
斯威夫特 2
UIView.animateWithDuration(0.3, animations: {
self.blurBg.alpha = 1
}, completion: {(_) -> Void in
self.blurBg.hidden = true
})
斯威夫特 3、4、5
UIView.animate(withDuration: 0.3, animations: {
self.blurBg.alpha = 1
}, completion: {(_) -> Void in
self.blurBg.isHidden = true
})
我将 Bool 区域设为下划线的原因是因为您没有使用该值,如果需要,可以将 (_) 替换为 (value : Bool)
有时你想把它放在一个变量中,根据情况以不同的方式制作动画。 为此你需要
let completionBlock : (Bool) -> () = { _ in
}
或者你可以使用同样冗长的:
let completionBlock = { (_:Bool) in
}
但无论如何,您必须在某处指明Bool
。
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()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.