【发布时间】:2017-05-24 06:43:16
【问题描述】:
我有一个非常简单的动画块,它执行以下动画:
func didTapButton() {
// reset the animation to 0
centerYConstraint.constant = 0
superview!.layoutIfNeeded()
UIView.animate(
withDuration: 1,
animations: {
// animate the view downwards 30 points
self.centerYConstraint.constant = 30
self.superview!.layoutIfNeeded()
})
}
当我自己播放动画时,一切都很棒。它重置到位置 0,然后动画 30 个点。
问题是当用户快速多次点击按钮时(即在正在进行的动画中间)。每次用户点击按钮时,我希望它重置到位置 0,然后向下动画 30 点。相反,我得到了这种行为:
它显然已经超过了 30 个点。 (接近 120 分。)
为什么会发生这种情况,如何正确“重置”动画,使其最多只能移动 30 点?
我尝试过的不起作用的方法:
- 使用
options: UIViewAnimationOptions.beginFromCurrentState。它的行为完全相同。 - 不是直接执行动画,而是在几毫秒后使用dispatch_after 执行。同样的行为。
-
"Canceling" the previous animation 使用
0第二个动画,将常量更改为0,并调用superview!.layoutIfNeeded。
其他说明:
- 如果我不改变位置,而是通过约束改变高度,我会得到类似的奇怪行为。例如。如果我将它设置为从 30 点到 15 点,当重复按下按钮时,视图会明显增长到 120 点左右。
- 即使我不使用约束,而是将
transform从CGAffineTransform.identity动画化到CGAffineTransform(scaleX: 0.5, y: 0.5),我也会得到相同的行为,它将增长到120 个点。 - 如果我尝试一个完全不同的动画属性,比如
backgroundColor = UIColor(white: 0, alpha: 0.5)到backgroundColor = UIColor(white: 0, alpha: 0),那么我会得到正确的行为(即每次点击按钮时,颜色最多重置为0.5灰色。它永远不会变成黑色.
【问题讨论】:
-
你想要什么行为?你真的想让它停止当前的动画,跳回原来的位置,然后再向下动画 30 点吗?还是您希望它忽略第二次和后续的点击)?
-
@Rob 在这种情况下我希望它跳回 0 位置,并动画到 30 点。