2016-05-12 7 views
-1

Я пытаюсь выполнить segue после завершения анимации. Вот код, я имею в viewDidAppear:Выполняется запись после завершения анимации

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    imageViewAnimated.startAnimating() 


    if label.center != CGPoint(x:50, y:10) { 

     UIView.animateWithDuration(2.0, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 
      self.label.center = self.view.center 

      }, completion: nil) 

     UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 
      //    self.label.center = CGPoint(x: 50,y:300) 
      self.label.alpha = 0.0 

      }, completion: nil) 
    } 

    if label.alpha == 0.0 { 
     UIView.animateWithDuration(0.5, delay: 10.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 

      self.performSegueWithIdentifier("backSegue", sender: self) 

      }, completion: nil) 
    } 
} 

Так в основном у меня есть ярлык, который движется вниз и гаснуть (первый и второй animateWithDuration), а затем я хочу Segue произойти после того, как этикетка затухать и другая анимация выполнена. Прямо сейчас происходит перерыв, но он делает это сразу и не ждет, сколько бы я не увеличил задержку.

+0

Если вы хотите выполнить какое-либо действие после того, как функция будет завершена, вам необходимо закодировать его в блоке «Завершение». Блок завершения будет вызван после того, как метод завершит свою работу. – Bharath

+0

Я обновил ответ, просто проверил –

ответ

1

Вы вызываете SEGUE в неправильном месте. Вы хотите что-то вроде этого:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    imageViewAnimated.startAnimating() 

    if label.center != CGPoint(x:50, y:10) { 
     UIView.animateWithDuration(2.0, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 
      self.label.center = self.view.center 
     }, completion: nil) 

     UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 
      //    self.label.center = CGPoint(x: 50,y:300) 
      self.label.alpha = 0.0 
     }, completion: { finished in 
      self.performSegueWithIdentifier("backSegue", sender: self) 
     }) 
    } 
} 
+0

Спасибо, что работает! Я не уверен, почему, но это займет некоторое время (около 15 секунд, чтобы сделать сегу). Это может быть мой медленный компьютер. – Bailey

0

Запустите свой код завершения после завершения. вы должны закодировать его в блоке «Завершение». Блок завершения будет вызван после метода завершает анимацию

UIView.animateWithDuration(0.5, delay: 10.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .CurveEaseOut, animations: {() -> Void in 

       //if you perform segue here if will perform with animation 

       }, completion: { finished in 

     //if you perform segue it will perform after it finish animating. 

    self.performSegueWithIdentifier("backSegue", sender: self) 


    }) 
0

Вы можете написать навигационный код в обработчик завершения части анимационного блока, потому что обработчик завершения будет срабатывать после завершения анимации.

[UIView animateWithDuration:0.25 animations:^{ 
    //Animation changes 
} completion:^(BOOL finished) { 
    //Navigation 
}]; 
+0

Обратите внимание, что вопрос отмечен Swift, а не Objective-C. – rmaddy

Смежные вопросы