1

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从第二个完成块中删除它可以正常工作并重复动画。这很有趣,因为如果它没有被隐藏,它应该会覆盖视图中的其他交互式内容,但事实并非如此。其他内容在模拟器中完全可以访问。UIImageViewimage绝对是 Storyboard 中的顶层。

4

3 回答 3

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
    })
})
于 2015-08-24T00:46:33.573 回答
2

我认为您需要在其他地方寻找错误。您似乎没有遗漏代码中的任何内容——因为我能够重复运行动画而没有任何问题。我已将您的代码原样复制到一个单独的项目中,并且动画每次都有效。

于 2015-08-24T00:46:34.587 回答
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
于 2015-08-23T23:12:29.630 回答