2016-05-19 5 views
1

私は以下の小さな機能を持っています。 3秒間のアニメーション、そしてそのアニメーションの完成時に、別の関数呼び出し。ただし、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にもアニメーションがあるので、アニメーションブロックが実行されるとすぐに完了ブロックが実行されると思います。しかし、プログレスバーがアニメーションのプロセスにあるので、機能が高速に実行されます。 –

+0

@ChathurangaSilvaが言うことは正しいと思います。とにかくこれにUIViewアニメーションブロックを使用しているのはなぜですか?プログレスバーには独自のアニメーションがあります。 –

答えて

3

ProgressBarUIProgressViewであると仮定すると、setProgressメソッドはアニメートされ、UIView.animateWithDurationコールに含める必要はありません。

これはsetProgressアニメーションは、おそらく長いあなたがsetProgressアニメーションが完了する前UIViewアニメーションがends-ときにself.switchToFastState()が呼び出されて、UIView.animateWithDurationコールに入れている時間よりもある意味。

ソリューション

  1. 変更期間を。 setProgress動画の再生時間を見積もり/推測し、アニメーションの継続時間をUIViewとして使用することで、これをハックすることができます。これはあなたがしようとしている動作を模倣する必要があります。

  2. GCDを使用してください。これは上記と同じ考えですが、UIViewのアニメーション方法は使用しません。 GCDの使い方はthis questionです。

  3. NSTimerまたはサブクラス化。 NSTimerまたはサブクラスUIProgressViewを使用するソリューションhereがあります。

+0

それは私が言っていることです!状況をはっきりと説明した。 –

+0

偉大な答えですが、私は解決策#1は超ハッキーだと思っています。これにはGCDまたはNSTimerを使用しました! –

+0

私の質問にお答えしていただきありがとうございます。 NSTimerを進捗状況と組み合わせて使用​​したくない理由は、進行状況が左から右に向かうにつれて非常にぎこちなくなるためです。 – zeeple

0

私はこれが最高解決策があるかどうかわからないのですが、これは私が一緒に行くことになったものです。このソリューションは、から(アニメーションすることができる)でsetProgressを削除

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

これにより、UIViewアニメーションを途切れることなく実行することができます。

関連する問題