【问题标题】:iOS animation doesn't reset when replayed repeatedlyiOS 动画在重复播放时不会重置
【发布时间】: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 点左右。
  • 即使我不使用约束,而是将transformCGAffineTransform.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 点。

标签: ios animation uiview


【解决方案1】:

我可以重现您描述的行为。但是如果我在正在移动的视图层上调用removeAllAnimations(),问题就会消失。

@IBAction func didTapButton(_ sender: Any) {
    animatedView.layer.removeAllAnimations()

    centerYConstraint.constant = 0
    view.layoutIfNeeded()

    centerYConstraint.constant = 30
    UIView.animate(withDuration: 2) {
        self.view.layoutIfNeeded()
    }
}

请注意,我不是从超级视图中删除动画(因为它仍然体现了您描述的行为),而是从正在移动的视图中删除。

【讨论】:

【解决方案2】:

到目前为止,我发现的唯一解决方案是重新创建视图,而不是尝试重置现有视图。

这给了我我正在寻找的确切行为:


(如果动画不播放,请点按图片)

很遗憾,您需要删除旧视图并创建一个新视图,但这是我找到的唯一解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2015-04-15
    相关资源
    最近更新 更多