2016-05-19 5 views
1

У меня есть следующая небольшая функция, которая содержит два основных действия, которые я хотел бы выполнить. Три секунды анимации, а затем по завершении этой анимации, другой вызов функции. Однако происходит то, что строка кода, которая вызывает другую функцию, выполняется до завершения анимации UIView.UIView анимация с завершающим блоком не работает

func switchToNormalState() { 

    print("Switching to Normal State") 
    currentState = "normal" 
    intervalCounter = intervalCounter + 1 

    setVisualsForState() 

    UIView.animateWithDuration(Double(normalDuration), animations: {() -> Void in 
     self.ProgressBar.setProgress(1.0, animated: true) 
     }, completion: { _ in 
      self.switchToFastState() 
    }) 

} 

Я изучил другие похожие должности, которые искали решение, но ни одно из решений не разрешило мою головоломку. Что я делаю неправильно в блоке завершения, чтобы сделать эти действия последовательностью, а не одновременной?

+0

Я думаю, что это происходит потому, что progressBar также имеет анимацию, поэтому я думаю, что завершение блока выполняется, как только выполняется анимационный блок. Но funtion работает быстро, потому что индикатор выполнения находится в процессе анимации. –

+0

Что @ChathurangaSilva говорит правильно. Почему вы все равно используете для этого блок анимации UIView? Индикатор выполнения имеет свои собственные анимации. –

ответ

3

Предполагая, что ProgressBar является UIProgressView, метод setProgress оживляет себя и не нужно содержаться в UIView.animateWithDuration вызова.

Это означает, что setProgress анимация, вероятно, больше, чем длительность вы кладете в UIView.animateWithDuration аукнется, так self.switchToFastState() вызывается, когда UIView анимации ends- до setProgress анимации завершается.

Solutions

  1. Изменение длительности. Вы можете взломать это, найдя/угадывая продолжительность анимации setProgress и используя это как продолжительность анимации UIView. Это должно имитировать поведение, в котором вы собираетесь двигаться.

  2. Измените продолжительность, но используйте GCD. Это та же идея, что и выше, но не использует метод анимации UIView. Вы можете увидеть this question, как использовать GCD.

  3. NSTimer или подклассификация. Существуют решения here, которые используют NSTimer или подкласс UIProgressView.

+0

Вот что я говорю! четко объяснил ситуацию. –

+0

Отличный ответ, но я думаю, что решение # 1 супер хаки и должно быть удалено. Просто использовал GCD или NSTimer для этого! –

+0

Большое спасибо за попытку ответить на мой вопрос. Причина, по которой я не хочу использовать NSTimer в сочетании с представлением о прогрессе, состоит в том, что это приводит к очень резкому опыту, поскольку прогресс идет слева направо. – zeeple

0

Я не уверен, если это решение лучше, но это то, что я в конечном итоге происходит с:

 ProgressBar.progress = 1.0 
     UIView.animateWithDuration(Double(normalDuration), animations: {() -> Void in 
      self.ProgressBar.layoutIfNeeded() 
      }, completion: { (_) -> Void in 
       self.switchToFastState() 
     }) 

Это решение устраняет setProgress (который может быть анимированный) от блок анимации, и это позволяет анимации UIView выполнять без перерыва.