animateWithDuration动画一次但不是两次

时间:2015-08-23 22:49:07

标签: swift animation animatewithduration

我在一个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绝对是故事板中的顶层。

3 个答案:

答案 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