【问题标题】:UIView animate with completion block not working带有完成块的 UIView 动画不起作用
【发布时间】:2016-05-19 03:33:33
【问题描述】:

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

}

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

【问题讨论】:

  • 我认为发生这种情况是因为 progressBar 也有动画,所以我认为一旦动画块运行,完成块就会执行。但是由于进度条处于动画过程中,所以功能运行得很快。
  • @ChathurangaSilva 所说的是正确的。你为什么要为此使用 UIView 动画块?进度条有自己的动画。

标签: swift uiview animatewithduration completion


【解决方案1】:

假设ProgressBarUIProgressViewsetProgress 方法会自行设置动画并且不需要包含在UIView.animateWithDuration 调用中。

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

解决方案

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

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

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

【讨论】:

  • 这就是我要说的!清楚地解释了情况。
  • 很好的答案,但我认为解决方案 #1 非常老套,应该删除。只是为此使用了 GCD 或 NSTimer!
  • 非常感谢您尝试回答我的问题。我不想将 NSTimer 与进度视图结合使用的原因是,当进度从左向右倾斜时,它会导致非常不稳定的体验。
  • @zeeple 没问题。您可以只使用解决方案 #1 或 #2,它们都使用您正在寻找的原生 setProgress 动画。
  • @DanielvanderMerwe 谢谢,我同意 #1 是 hacky - 我保留它以防人们同时为其他 UI 元素设置动画。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多