タイムライン上の整数を表す離散点でスライダーを停止させたいと思います。これを行う最良の方法は何ですか?間に値は必要ありません。スライダーが「スナップ」して各個別のポイントに配置できれば、すばらしいでしょう。
特定のポイントでスライダーを「固定」するには、スライダーからリンクされているvalueChangedメソッドで、ViewControllerがスライダーの値から適切な丸めを決定し、setValue:animated:を使用してスライダーを適切な場所に移動します。したがって、スライダーが0から2になり、ユーザーが0.75に変更した場合、これを1に設定し、スライダーの値をその値に設定する必要があります。
ここで行った手順は、jrturtonの答えで述べたものとほとんど同じでしたが、スライダーが私の動きにかなり遅れをとっていることに気付きました。これは私がこれをどのように行ったかです:
Interface Builderのビューにスライダーを配置します。スライダーの最小/最大値を設定します。 (0と5を使用しました)
.hファイル内:
@property (strong, nonatomic) IBOutlet UISlider *mySlider;
- (IBAction)sliderChanged:(id)sender;
.mファイル内:
- (IBAction)sliderChanged:(id)sender
{
int sliderValue;
sliderValue = lroundf(mySlider.value);
[mySlider setValue:sliderValue animated:YES];
}
この後、Interface Builderで、スライダーの「Touch Up Inside」イベントを「Value Changed」ではなくFile's Ownerに接続しました。これで、スライダーをスムーズに動かし、指を離したときに各整数にスナップできるようになりました。
ありがとう@jrturton!
[〜#〜] update [〜#〜]-スウィフト:
@IBOutlet var mySlider: UISlider!
@IBAction func sliderMoved(sender: UISlider) {
sender.setValue(Float(lroundf(mySlider.value)), animated: true)
}
また、ストーリーボードに物事を接続するのに混乱がある場合は、githubに簡単な例をアップロードしました。 https://github.com/nathandries/StickySlider
私がこれをしたのは、最初に現在のスライダー値の「出力」変数を整数に設定することです(デフォルトではfloatです)。次に、出力番号をスライダーの現在の値として設定します。
int output = (int)mySlider.value;
mySlider.value = output;
これにより、1整数の増分で移動するように設定されます。たとえば5秒など、特定の数値範囲で移動するには、次の式を使用して出力値を変更します。上記の最初の2行の間にこれを追加します。
int output = (int)mySlider.value;
int newValue = 5 * floor((output/5)+0.5);
mySlider.value = newValue;
スライダーを移動すると、5の倍数に「ジャンプ」します。
Nathanが提案したとおりに行いましたが、現在の値をリアルタイムで表示する関連UILabel
も更新したいので、ここで私がしたことを示します。
- (IBAction) countdownSliderChanged:(id)sender
{
// Action Hooked to 'Value Changed' (continuous)
// Update label (to rounded value)
CGFloat value = [_countdownSlider value];
CGFloat roundValue = roundf(value);
[_countdownLabel setText:[NSString stringWithFormat:@" %2.0f 秒", roundValue]];
}
- (IBAction) countdownSliderFinishedEditing:(id)sender
{
// Action Hooked to 'Touch Up Inside' (when user releases knob)
// Adjust knob (to rounded value)
CGFloat value = [_countdownSlider value];
CGFloat roundValue = roundf(value);
if (value != roundValue) {
// Almost 100% of the time - Adjust:
[_countdownSlider setValue:roundValue];
}
}
もちろん、欠点は、スライダーごとに2つのアクション(メソッド)を必要とすることです。