web-dev-qa-db-ja.com

iOSスライダーを離散ポイントで停止させる方法

タイムライン上の整数を表す離散点でスライダーを停止させたいと思います。これを行う最良の方法は何ですか?間に値は必要ありません。スライダーが「スナップ」して各個別のポイントに配置できれば、すばらしいでしょう。

42
gonzobrains

特定のポイントでスライダーを「固定」するには、スライダーからリンクされているvalueChangedメソッドで、ViewControllerがスライダーの値から適切な丸めを決定し、setValue:animated:を使用してスライダーを適切な場所に移動します。したがって、スライダーが0から2になり、ユーザーが0.75に変更した場合、これを1に設定し、スライダーの値をその値に設定する必要があります。

39
jrturton

ここで行った手順は、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

65
Nathan Dries

私がこれをしたのは、最初に現在のスライダー値の「出力」変数を整数に設定することです(デフォルトでは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の倍数に「ジャンプ」します。

6
ctlockey

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つのアクション(メソッド)を必要とすることです。

4
Nicolas Miari