--valuesに沿って任意の値の配列を取得しました。これは、このアプローチUISlider
のようなものを使用して目盛り/停止として使用したいが、スライダー フレーム自体に描画されます。スライダーのフレーム内のスライダーに沿ってこれらの値のピクセル/ポイント位置を確実に見つけたり計算したりするにはどうすればよいですか?
強調するために: UISlider のサム イメージの中心を取得する方法とは異なり、スライダーのフレーム内の位置が必要です。
持っておくべき 2 つの重要な情報は、親指のピクセル/ポイントの範囲と、この範囲の原点です。その情報から、ポイントの位置を計算するのは簡単です。これが私が試したことです。このコードは から呼び出されviewDidLoad
ます:
CGRect bounds = slider.bounds;
CGRect trackRect = [slider trackRectForBounds:bounds];
//float thumbWidth = slider.currentThumbImage.size.width; // why does this give 0?
float thumbWidth = 23;
float thumb0 = 0.5 * thumbWidth; // left-most posn. of thumb center
float thumbRange = trackRect.size.width - thumbWidth; // point range of thumb
float sliderValueMin = slider.minimumValue;
float sliderValueWidth = slider.maximumValue - sliderValueMin;
float pointsPerValueUnit = thumbRange/sliderValueWidth;
それで
float tickPos = pointsPerValueUnit * (tickValue - sliderValueMin) + thumb0;
理論的には正しいはずですよね?しかし、右側の近くの位置をプロットすると、それらは数ポイントずれています。いじってみると、正しい結果が得られるファッジが見つかりました...少なくとも現在のスライダー構成では:
float thumbRange = trackRect.size.width - thumbWidth + 3.5;
コードをさまざまな値の範囲、スライダーのサイズ、カスタム サムなどで再利用できるようにしたいので、2 つの問題/質問があります。
- なぜこの〜3.5ファッジファクターが必要なのですか? それはどこから来て、すべてのスライダーで同じかどうかをどのように知ることができますか?
- から値を取得できないのはなぜ
slider.currentThumbImage.size.width
ですか? このパラメーターは、アプリの実行の後半 (スライダーの値が変化したとき) に値を持ちます。 * にない場合viewDidLoad
、いつ目盛りを描画する必要がありますか?
よろしくお願いします。
※ thumbWidth
inについても同様です。
CGRect thumbPosition = [slider thumbRectForBounds:bounds trackRect:trackRect value:slider.value];
thumbWidth = thumbPosition.size.width;
編集
私はこれまでに得た回答に感謝していますが、それらから判断すると、私の質問が十分に正確ではなかったようです.
コメントで述べたように、私の考えは、このコードを再利用可能にする (そしてコミュニティで利用できるようにする) ことです。そのため、開発者は単にコードを配置する必要があり、自分のファッジ要因を見つけるためにいじる必要はありません。独自のスライダー。それでは、質問#1を明確にしましょう:
1'. 3.5 を取得する方法はありますか? 特定のスライダー構成に対して任意の数を取得する方法はありますか? たとえば、スライダーのパラメーター (に似ていますthumbWidth
) で、目盛りが自動的に正しく配置されるのでしょうか?
UISlider
クラス リファレンスはかなりまばらです。それを読んで、私は決してslider.currentThumbImage.size.width;
非であるとは思っていなかったでしょうnil
. 3.5 っぽいファッジも同様にUISlider
のあいまいなプロパティに隠されているのではないかと考えています。
実際、私が今書いたものを読み直すと、質問 #2に対する可能な答えが示唆されます。スライダーがまだ描画されていないため、つまみの幅が設定されていない可能性があります...そうでしょうか?