1

私は、発生したい2つの主要なアクションを含む次の小さな関数を持っています。3 秒間のアニメーションと、そのアニメーションの完了時に別の関数呼び出し。ただし、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()
    })

}

解決策を探して他の同様の投稿を調査しましたが、どの解決策も私のパズルを解決していません。これらのアクションを同時ではなくシーケンスにするために、完了ブロックで何が間違っていますか?

4

2 に答える 2

3

ProgressBarそれが であると仮定するとUIProgressView、メソッドはそれ自体をアニメーション化し、呼び出しsetProgressに含める必要はありません。UIView.animateWithDuration

これは、アニメーションが呼び出しにsetProgress入れている時間よりもおそらく長いことを意味するため、アニメーションが終了する前にアニメーションが呼び出されます。UIView.animateWithDurationself.switchToFastState()UIViewsetProgress

ソリューション

  1. 期間を変更します。setProgressアニメーションの長さを見つけて推測し、それをアニメーションの長さとして使用することで、これを回避できますUIView。これは、目的の動作を模倣する必要があります。

  2. 期間を変更しますが、GCD を使用します。これは上記と同じ考え方ですが、UIViewアニメーション方式を使用していません。GCD の使用方法については、この質問を参照してください。

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

于 2016-05-19T03:50:56.057 に答える