带有完成块的 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
是一个 UIProgressView
,setProgress
方法会自动生成动画,不需要包含在 UIView.animateWithDuration
调用中。
这意味着 setProgress
动画可能比您在 UIView.animateWithDuration
调用中的持续时间长,因此 self.switchToFastState()
在 UIView
动画时被调用结束- 在 setProgress
动画完成之前。
解决方案
更改持续时间。您可以通过 finding/guessing setProgress
动画的持续时间并将其用作您的 UIView
动画持续时间来解决这个问题。这应该模仿您想要的行为。
更改持续时间但使用 GCD。这与上面的想法相同,但没有使用 UIView
动画方法。 GCD的使用方法可以看
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 动画在不中断的情况下执行。
我有以下小函数,其中包含我希望执行的两个主要操作。三秒钟的动画,然后在该动画完成后,另一个函数调用。然而,正在发生的事情是调用另一个函数的代码行在 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
是一个 UIProgressView
,setProgress
方法会自动生成动画,不需要包含在 UIView.animateWithDuration
调用中。
这意味着 setProgress
动画可能比您在 UIView.animateWithDuration
调用中的持续时间长,因此 self.switchToFastState()
在 UIView
动画时被调用结束- 在 setProgress
动画完成之前。
解决方案
更改持续时间。您可以通过 finding/guessing
setProgress
动画的持续时间并将其用作您的UIView
动画持续时间来解决这个问题。这应该模仿您想要的行为。更改持续时间但使用 GCD。这与上面的想法相同,但没有使用
UIView
动画方法。 GCD的使用方法可以看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 动画在不中断的情况下执行。