1

私は進行状況をアニメーション化するために単純な UISlider を設定しています:

[UIView animateWithDuration:songLength
         delay:0.0
       options:UIViewAnimationOptionRepeat|
         UIViewAnimationOptionAllowUserInteraction|
         UIViewAnimationOptionBeginFromCurrentState
       animations:^{
        [UIView setAnimationDuration:10.0];
        [myUISlider setValue:10.0];
       } completion:nil
   ];

  [UIView commitAnimations];

ユーザーがボタンを押すと、その場所でアニメーションを停止したい。

値を把握するためにプレゼンテーション レイヤーにクエリを実行する必要があることは理解していますが、プレゼンテーション レイヤーのタイプは CALayer であり、UISlider ではありません。したがって、画面上の x/y 位置のようなレイヤー プロパティがありますが、スライダー自体の値はありません。

設計上、プレゼンテーション レイヤーがレイヤーの現在のすべてのアニメーション データにアクセスできることは理にかなっていますが、コードでそれを処理する方法がわかりません。

何か案は?

4

1 に答える 1

0

あなたが同じ問題を扱っている場合に備えて、私はこの問題を解決する1つの方法を考え出しました。設計上、UISliderのアニメーション化されたサムをクエリする明確な方法はありません。アニメーションクエリはレイヤーに対して適切に機能するため、1つの方法は、独自の背景を作成し、親指であるレイヤーをアニメーション化することです。

私がこれを回避する方法は、NSTimerクラスの使用です。プログレスバーのアニメーションを開始したい場合は、NSTimerを0.1秒間隔に設定し、関数を呼び出して親指の位置を更新します。親指の前後のアニメーション(進行するにつれて、左側の部分は青で、残っている部分はまだ白です)が自動的に処理されます。

コードは次のとおりです。

updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];

したがって、0.01秒ごとにこのメソッドが呼び出され、親指が再描画されてアニメーションが作成されます。アニメーションブロックは必要ありません。

これはうまく機能し、結果に満足しています。私はパフォーマンスに関心があり、この実装がどれほどリソースを消費するかを測定します。私が上で述べた最初のオプションを選択するのは良い考えかもしれません。

于 2010-11-16T23:04:23.170 に答える