带有完成块的 UIView 动画不起作用

UIView animate with completion block not working

我有以下小函数,其中包含我希望执行的两个主要操作。三秒钟的动画,然后在该动画完成后,另一个函数调用。然而,正在发生的事情是调用另一个函数的代码行在 UIView 动画完成之前被执行。

func switchToNormalState() {

    print("Switching to Normal State")
    currentState = "normal"
    intervalCounter = intervalCounter + 1

    setVisualsForState()

    UIView.animateWithDuration(Double(normalDuration), animations: { () -> Void in
        self.ProgressBar.setProgress(1.0, animated: true)
        }, completion: { _ in
            self.switchToFastState()
    })

}

我研究了其他类似的帖子来寻找解决方案,但是 none 的解决方案解决了我的难题。为了使这些操作按顺序而不是同时进行,我在完成块中做错了什么?

假设 ProgressBar 是一个 UIProgressViewsetProgress 方法会自动生成动画,不需要包含在 UIView.animateWithDuration 调用中。

这意味着 setProgress 动画可能比您在 UIView.animateWithDuration 调用中的持续时间长,因此 self.switchToFastState()UIView 动画时被调用结束- 在 setProgress 动画完成之前。

解决方案

  1. 更改持续时间。您可以通过 finding/guessing setProgress 动画的持续时间并将其用作您的 UIView 动画持续时间来解决这个问题。这应该模仿您想要的行为。

  2. 更改持续时间但使用 GCD。这与上面的想法相同,但没有使用 UIView 动画方法。 GCD的使用方法可以看

  3. NSTimer 或子类化。有解决方案 here 使用 NSTimer 或子类 UIProgressView.

我不确定这是否是最好的解决方案,但这是我最终采用的方法:

        ProgressBar.progress = 1.0
        UIView.animateWithDuration(Double(normalDuration), animations: { () -> Void in
            self.ProgressBar.layoutIfNeeded()
            }, completion: { (_) -> Void in
                self.switchToFastState()
        })

此解决方案从动画块中删除了 setProgress(可能是动画),这允许 UIView 动画在不中断的情况下执行。