我在一个switch
语句中有这个动画,它运行并完成它应该做的事情。在计时器内每20秒成功调用一次动画。但是,动画不会在任何时候发生,而是第一次。在下面的代码中,您将看到我曾经尝试过的println
语句并突出显示该问题。每个println
语句都会打印,但不会发生任何动画。我错过了什么?
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 image
绝对是故事板中的顶层。
答案 0 :(得分:2)
我可能会离开,但似乎你是从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
})
})
答案 1 :(得分:2)
我认为您需要在其他地方寻找您的错误。您似乎没有丢失代码中的任何内容 - 因为我能够反复运行动画而没有任何问题。我按原样to a separate project复制了您的代码,每次动画都有效。
答案 2 :(得分:0)
尝试更换:
let image = self.overlayImageView[indexNumber]
image.hidden = false
image.alpha = 0.0
与
let image = self.overlayImageView[indexNumber]
image.superview.bringSubviewToFront(image)
image.hidden = false
image.alpha = 0.0