Swift animateWithDuration设置一次动画,但不设置两次

Swift animateWithDuration设置一次动画,但不设置两次,swift,animation,animatewithduration,Swift,Animation,Animatewithduration,我在switch语句中有一段动画,它运行并执行它应该执行的操作。在计时器内,动画每二十秒成功调用一次。但是,动画不会在任何时候发生,而是第一次发生。在我下面的代码中,您将看到println语句,我曾试图强调这个问题。每个println语句都会打印,但不会发生动画。我错过了什么 func popAnimation(indexNumber: Int) { let image = self.overlayImageView[indexNumber] image.hidden = fa

我在switch语句中有一段动画,它运行并执行它应该执行的操作。在计时器内,动画每二十秒成功调用一次。但是,动画不会在任何时候发生,而是第一次发生。在我下面的代码中,您将看到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图像肯定是故事板的顶层。

尝试替换:

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的其他交互内容吗?