我有以下小功能,其中包含两个我想要发生的主要动作。一个三秒钟的动画,然后在完成那个动画后,另一个函数调用。然而,正在发生的事情是,在UIView动画完成之前,正在执行调用另一个函数的代码行。
function onMymodulewithxmlInit(args) {
console.log('myString', page.myObject); // "Works fine"
console.log('myObject', page.myObject); // undefined
}
我已经研究过寻找解决方案的其他类似帖子,但没有一个解决方案解决了我的难题。我在完成块中做错了什么才能使这些操作成为序列而不是同步?
答案 0 :(得分:3)
假设ProgressBar
是UIProgressView
,setProgress
方法会自动设置动画,而不需要包含在UIView.animateWithDuration
调用中。
这意味着setProgress
动画可能比您在UIView.animateWithDuration
调用中的持续时间更长,因此当self.switchToFastState()
动画结束时调用UIView
在setProgress
动画完成之前。
<强>解决方案强>
更改持续时间。您可以通过查找/猜测setProgress
动画的持续时间并将其用作UIView
动画持续时间来解决此问题。这应该模仿你想要的行为。
更改持续时间但使用GCD。这与上面的想法相同,但不使用UIView
动画方法。您可以看到this question了解如何使用GCD。
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动画。