1

我有以下小功能,其中包含我想要执行的两个主要操作。三秒钟的动画,然后在该动画完成后,另一个函数调用。然而,正在发生的是调用另一个函数的代码行在 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()
    })

}

我研究了其他类似的帖子以寻找解决方案,但没有一个解决方案解决了我的难题。为了使这些动作成为顺序而不是同时发生,我在完成块中做错了什么?

4

2 回答 2

3

假设它ProgressBar是 a UIProgressView,则该setProgress方法会自行设置动画并且不需要包含在UIView.animateWithDuration调用中。

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

解决方案

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

  2. 更改持续时间但使用 GCD。这和上面的想法是一样的,但是没有使用UIView动画方法。你可以看到这个问题来了解如何使用 GCD。

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

于 2016-05-19T03:50:56.057 回答
2

我不确定这是否是最好的解决方案,但这就是我最终的结果:

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

此解决方案从动画块中删除 setProgress(可能是动画的),这允许 UIView 动画执行而无需中断。

于 2016-05-19T05:03:33.953 回答