UIView动画与完成块无法正常工作

时间:2016-05-19 03:33:33

标签: swift uiview animatewithduration completion

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

function onMymodulewithxmlInit(args) {
    console.log('myString', page.myObject); // "Works fine"
    console.log('myObject', page.myObject); // undefined
}

我已经研究过寻找解决方案的其他类似帖子,但没有一个解决方案解决了我的难题。我在完成块中做错了什么才能使这些操作成为序列而不是同步?

2 个答案:

答案 0 :(得分:3)

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

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

<强>解决方案

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

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

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

答案 1 :(得分:1)

我不确定这是否是最佳解决方案,但这是我最终的目标:

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

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