Ser*_*mer 4 uiviewanimation ios swift
我有一个函数可以开始播放异步运行的动画(在后台)。使用完成处理程序无限期调用此动画(见下文)。有没有办法在按下另一个按钮时关闭此功能?
这是我的代码:
func showAnimation() {
UIView.animate(withDuration: 1, animations: {
animate1(imageView: self.Anime, images: self.animation1)
}, completion: { (true) in
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.showAnimation() // replay first showAnimation
}
})
}
Run Code Online (Sandbox Code Playgroud)
然后按下另一个按钮,我们关闭上述功能
showAnimation().stop();
Run Code Online (Sandbox Code Playgroud)
谢谢
有很多方法可以做到这一点。最简单的方法是拥有一个 Boolean 属性(您应该正确地将其设置为原子),您可以在asyncAfter块中检查该属性,并且showAnimation()如果它为真,则不要再次调用。
另一件事你可以做的,我喜欢更复杂的任务做什么,就是用OperationQueue替代DispatchQueue。这允许您单独或一次性取消操作,甚至挂起整个队列(显然不要挂起主队列或调用removeAllOperations()它,因为那里可能还有其他与您的代码无关的操作)。
您可以向该类添加一个属性,以充当指示是否应运行动画的标志。
var runAnimation = true
func showAnimation() {
if !runAnimation { return }
UIView.animate(withDuration: 1, animations: {
animate1(imageView: self.Anime, images: self.animation1)
}, completion: { (true) in
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
if runAnimation {
self.showAnimation() // replay first showAnimation
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
然后在按钮处理程序中停止动画,您只需执行以下操作:
runAnimation = false
Run Code Online (Sandbox Code Playgroud)
请注意,这不会停止当前运行的 1 秒动画。这只是防止更多的动画。
| 归档时间: |
|
| 查看次数: |
5811 次 |
| 最近记录: |