Swift animateWithDuration设置一次动画,但不设置两次
我在switch语句中有一段动画,它运行并执行它应该执行的操作。在计时器内,动画每二十秒成功调用一次。但是,动画不会在任何时候发生,而是第一次发生。在我下面的代码中,您将看到println语句,我曾试图强调这个问题。每个println语句都会打印,但不会发生动画。我错过了什么Swift animateWithDuration设置一次动画,但不设置两次,swift,animation,animatewithduration,Swift,Animation,Animatewithduration,我在switch语句中有一段动画,它运行并执行它应该执行的操作。在计时器内,动画每二十秒成功调用一次。但是,动画不会在任何时候发生,而是第一次发生。在我下面的代码中,您将看到println语句,我曾试图强调这个问题。每个println语句都会打印,但不会发生动画。我错过了什么 func popAnimation(indexNumber: Int) { let image = self.overlayImageView[indexNumber] image.hidden = fa
func popAnimation(indexNumber: Int) {
let image = self.overlayImageView[indexNumber]
image.hidden = false
image.alpha = 0.0
UIView.animateWithDuration(0.75, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: nil, animations: { () -> Void in
println("animation ran")
println(image.alpha)
image.image = UIImage(named: "lowCountOverlay")
image.alpha = 1.0
}, completion: { (Bool) -> Void in
UIView.animateWithDuration(0.75, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: nil, animations: { () -> Void in
println("animation 2 ran")
println(image.alpha)
image.alpha = 0.0
}, completion: { (Bool) -> Void in
println("animation 3 ran")
image.hidden = true
})
})
}
更新:如果我从第二个完成块中删除image.hidden,它可以正常工作并重复设置动画。这很有趣,因为如果它没有隐藏,它应该覆盖视图中的其他交互内容,但事实并非如此。其他内容在模拟器中完全可以访问。UIImageView图像肯定是故事板的顶层。尝试替换:
let image = self.overlayImageView[indexNumber]
image.hidden = false
image.alpha = 0.0
与
尝试替换:
let image = self.overlayImageView[indexNumber]
image.hidden = false
image.alpha = 0.0
与
我可能会退出,但似乎您正在从一个NSTimer运行,它可能在主线程中,也可能不在主线程中。 UI更新需要在主线程中进行,请尝试将完成处理程序包装在定向到主线程的GCD调度中,如下所示,看看这是否有帮助?甚至可能把整件事都推到主线上
UIView.animateWithDuration(0.75, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: nil, animations: { () -> Void in
// First animation
}, , completion: { (Bool) -> Void in
dispatch_async(dispatch_get_main_queue(),{
// second animation
})
})
我可能会退出,但似乎您正在从一个NSTimer运行,它可能在主线程中,也可能不在主线程中。 UI更新需要在主线程中进行,请尝试将完成处理程序包装在定向到主线程的GCD调度中,如下所示,看看这是否有帮助?甚至可能把整件事都推到主线上
UIView.animateWithDuration(0.75, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: nil, animations: { () -> Void in
// First animation
}, , completion: { (Bool) -> Void in
dispatch_async(dispatch_get_main_queue(),{
// second animation
})
})
我认为你需要在别处寻找你的bug。代码中似乎没有遗漏任何内容,因为我可以重复运行动画,没有任何问题。我按原样复制了您的代码,动画每次都能正常工作。我认为您需要在其他地方查找您的bug。代码中似乎没有遗漏任何内容,因为我可以重复运行动画,没有任何问题。我已按原样复制了您的代码,动画每次都可以运行。但在函数的开头,“image.hidden”设置为false。无骰子。这件事把我难住了。它可以完美运行一次,但一旦计时器再次触发它,除了println以外什么都不会发生。@spacemonkey有没有机会上传您的源代码?我很感谢您提供查看它,但该项目几乎完成了,大约2000行。另外,我是github新手。@spacemonkey您可以尝试在虚拟项目中重现相同的问题-您不需要共享实际的问题。在这个过程中,您可以自己识别bug;但是在函数的开头,image.hidden被设置为false。没有骰子。这件事把我难住了。它可以完美运行一次,但一旦计时器再次触发它,除了println以外什么都不会发生。@spacemonkey有没有机会上传您的源代码?我很感谢您提供查看它,但该项目几乎完成了,大约2000行。另外,我是github新手。@spacemonkey您可以尝试在虚拟项目中重现相同的问题-您不需要共享实际的问题。在这个过程中,您可以自己识别bug;刚试过这个,不,它似乎与GCD无关。至少不是那种形式。更新的操作。只是尝试了这个,不,它似乎与GCD无关。至少不是那种形式。更新的OP。它不是覆盖了阿尔法为0的其他交互内容吗?它不是覆盖了阿尔法为0的其他交互内容吗?