Swift animateWithDuration立即完成

时间:2015-04-15 18:40:05

标签: ios cocoa-touch swift uiviewanimationtransition

这是我的代码 我马上得到了打印输出。 我希望在此期间更改我的uiview的背景颜色。

func animate() {

UIView.animateWithDuration(3.0, delay: 0.0, options:

UIViewAnimationOptions.CurveLinear, animations: {

  //self.grid.backgroundColor = UIColor.redColor()            
  println("1")

  UIView.animateWithDuration(1.0, delay: 1.0, options: UIViewAnimationOptions.CurveLinear, animations: {

      //self.grid.backgroundColor = UIColor.clearColor()
      println("2")

    },
    completion: {
      (finished: Bool) - > Void in

        println("3")

    })
}, completion: {
  (finished: Bool) - > Void in

    println("4")

  })
}

4 个答案:

答案 0 :(得分:2)

你想要制作动画的东西是不可动画的。通过检查您的代码我理解您正在尝试使视图透明。

您可以通过将视图的alpha设置为零来实现此目的。 (Alpha是可动画的)。

与红色相同。尝试使用图层背景颜色

另请注意,animationWithDuration不会延迟值的赋值,值会立即分配

UIView.animateWithDuration(3.0, delay: 0.0, options:UIViewAnimationOptions.CurveLinear, animations: {

  self.grid.layer.backgroundColor = UIColor.redColor().CGColor           


  UIView.animateWithDuration(1.0, delay: 1.0, options: UIViewAnimationOptions.CurveLinear, animations: {

      self.grid.alpha = 0


    },
    completion: {(finished: Bool) - > Void in})
}, completion: {(finished: Bool) - > Void in})}

答案 1 :(得分:1)

有几件事。只有一些东西是可动画的。 println()不可动画。

其次,不清楚在UIView.animateWithDuration的另一个调用的动画块中嵌套对UIView.animateWithDuration的调用会做什么。

在外部UIView.animateWithDuration调用的完成块内嵌套第二次调用UIView.animateWithDuration是合理的,但不在动画块中。

可能是动画的代码被注释掉了,所以你希望完成什么?

编辑:

这是一个IBAction方法,可以将视图的背景颜色从白色变为红色,然后再变回白色。它完美地运作:

@IBAction func handleAnimateButton(sender: UIButton)
{
  sender.enabled = false
  UIView.animateWithDuration(NSTimeInterval(0.2),
    delay: NSTimeInterval(0.5),
    options: UIViewAnimationOptions.CurveEaseInOut,
    animations:
    {
      self.aView.backgroundColor = UIColor.redColor()
  },
    completion:
    {
      This code gets called when the first animation finished.
      (value: Bool ) in
      //Create a new animation to switch the BG color back to white
      UIView.animateWithDuration(NSTimeInterval(0.5),
        animations:
        {
          self.aView.backgroundColor = UIColor.whiteColor()
        },
        completion:
        {
          (value: Bool ) in
          sender.enabled = true
        }
      )
    }
  )
}

请注意,第二个动画调用位于第一个动画调用的完成块内。

答案 2 :(得分:0)

我认为您遇到的问题是您在另一个animateWithDuration内调用delay选项。这可能会破坏程序。你应该解决这个问题。

希望有所帮助:)

答案 3 :(得分:0)

我没有专家,但Duncan在第一个动画的完成块中嵌套第二个动画的答案应该适合你。我不得不删除最后一个" sender.enabled = true"一块让它工作。那说,如果有任何读者'时间问题没有解决,这里有其他我读过的选项...

使用NSTimeInterval: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/

或使用盛大的中央调度(功能强大,但很复杂): http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1

显然iOS有一种新方法: http://commandshift.co.uk/blog/2014/04/01/stop-nesting-animation-blocks/

同样,我认为有序动画可以通过完成块方法获得,但这些是一些替代方案。