【问题标题】:Animation going too fast. Can't seem to slow down动画过快。似乎无法减速
【发布时间】:2015-09-27 07:52:25
【问题描述】:

我的动画过快了。我正在做一个模式匹配游戏,我有 4 个不同颜色的 UIView。我想让一个闪烁,然后大约一秒钟后,让另一个 UIView 闪烁。视图通过我的标签标识符闪烁,我已经为每个视图(1、2、3、4)设置了不同的值。似乎他们都在同时进行。我已经尝试过调整 animateWithDuration 函数的值,但这似乎没有帮助。

这是我的打印输出,因此您可以看到它以正确的顺序执行...

gary
3
gary
2
gary
2
gary
3
gary
2



func beginGame() {
    var level = 5

    for _ in 1...level {
        self.randomNumber = Int(arc4random_uniform(4)) + 1
        let originalColor:UIColor = self.view.viewWithTag(randomNumber)!.backgroundColor!
        UIView.animateWithDuration(1, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: {


            self.view.viewWithTag(self.randomNumber)!.backgroundColor = UIColor.whiteColor()
              self.view.viewWithTag(self.randomNumber)!.backgroundColor = originalColor

            print("gary")


            }, completion: nil)
         print(randomNumber)

        enemyArray.append(randomNumber)

    }
}

//新代码

    func beginGame(){

    var level = 5

    for _ in 1...level {
        self.randomNumber = Int(arc4random_uniform(4)) + 1
        let originalColor:UIColor = self.view.viewWithTag(randomNumber)!.backgroundColor!
        UIView.animateWithDuration(1, delay: 4, options: UIViewAnimationOptions.CurveEaseOut, animations: {


            self.view.viewWithTag(self.randomNumber)!.backgroundColor = UIColor.whiteColor()
              self.view.viewWithTag(self.randomNumber)!.backgroundColor = originalColor

            print("gary")


            }, completion: nil)

         print(randomNumber)

        enemyArray.append(randomNumber)

    }




}

【问题讨论】:

  • 您是否尝试过在 animateWithDuration 方法中增加延迟,以使四个不同的动画不会同时触发?
  • 是的,我有。我玩过这两种价值观。
  • 你实际上是在同时做所有的动画。 for 循环将所有动画排队,然后它们都同时运行。增加每一个的延迟,让它等到前一个完成。
  • 我增加了延迟。它让一切都变得更慢,但就像你说的,它们似乎都在同时进行。
  • 您还要在更改的颜色有机会生效之前重置每个视图的背景颜色。

标签: ios swift


【解决方案1】:

听听人们在告诉你什么。如果您使用 for 循环并创建多个延迟值均为 0 的动画,它们将同时运行。不要那样做。

改为使用类似这样的代码:

let pauseBetweenAnimations = 1.0
for step in 1...level {
  self.randomNumber = Int(arc4random_uniform(4)) + 1
  let originalColor:UIColor = 
    self.view.viewWithTag(randomNumber)!.backgroundColor!
  UIView.animateWithDuration(1, delay: (step - 1) * pauseBetweenAnimations, 
    options: UIViewAnimationOptions.CurveEaseOut, 
    animations:
    //the rest of your code goes here...

这将使每个后续动画在前一个动画之后 1 秒开始。如果 1 秒太长,请更改 pauseBetweenAnimations 的值。

【讨论】:

  • 很抱歉,该代码也不起作用。它不喜欢步骤-1。您能否为该功能添加更多内容,以便我可以复制和粘贴以查看它是否能在逻辑上工作?我过去也调整了延迟,但也没有用。
  • 您可能需要添加类型转换才能将(步骤 1)转换为 Double。试试这个:` UIView.animateWithDuration(1, delay: Double(step - 1) * pauseBetweenAnimations
  • 我认为它喜欢 Int 不是以前尝试的两倍。 step还有数值吗?
  • 延迟应该是双精度。根据您的代码,我假设该步骤是一个 Int。 level的类型是什么?
  • 增加延迟不起作用。我仍然遇到同样的问题。这就是您上面的代码正在做的事情。我已经试过了。
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多