UISLIDERのプレゼンテーションレイヤーのクエリ
-
29-09-2019 - |
質問
私はそれをアニメーション化するためにシンプルなuisliderを設定しています:進捗状況:
[UIView animateWithDuration:songLength
delay:0.0
options:UIViewAnimationOptionRepeat|
UIViewAnimationOptionAllowUserInteraction|
UIViewAnimationOptionBeginFromCurrentState
animations:^{
[UIView setAnimationDuration:10.0];
[myUISlider setValue:10.0];
} completion:nil
];
[UIView commitAnimations];
ユーザーがボタンを押すと、その場所でアニメーションを停止したいと思います。
値を把握するには、プレゼンテーションレイヤーを照会する必要があることを理解していますが、プレゼンテーションレイヤーはタイプのカレイヤーであり、Uisliderではありません。したがって、画面上のX/Y位置のように、レイヤープロパティがありますが、スライダー自体の値ではありません。
設計により、プレゼンテーションレイヤーがレイヤーの現在のすべてのアニメーションデータにアクセスできることは理にかなっていますが、コードでそれをどのように動作させるかはわかりません。
何か案は?
解決
あなたが同じ問題に対処している場合に備えて、私はこの問題を解決する1つの方法を見つけました。設計上、Uisliderのアニメーション親指を照会する明確な方法はありません。アニメーションクエリはレイヤーに対してうまく機能するため、1つの方法は、独自の背景を作成し、親指であるレイヤーをアニメーション化することです。
これを回避する方法は、NSTIMERクラスの使用です。 Progress Barをアニメーションに開始したいようになったら、0.1S間隔でNSTIMERを設定し、関数を呼び出して親指の位置を更新します。親指の前/後のアニメーション(左の部分が青く、まだ白くなっているものがまだ白)が自動的に世話されます。
これがコードです:
updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];
したがって、このメソッドの.01ごとに呼び出され、親指を再描画し、アニメーションを作成します。アニメーションブロックは必要ありません。
これはうまく機能し、結果に満足しています。私はパフォーマンスに関心があり、この実装がリソースを集中していることを測定します。上記の最初のオプションを使用するのは良い考えかもしれません。