2011-08-16 8 views
34

タイムライン上の整数を表す離散点でスライダを停止させたいと考えています。これを行う最善の方法は何ですか?私はその間に値を入れたくありません。スライダが各離散点に位置するように「スナップ」することができれば、素晴らしいことです。iOS離散点でスライダを停止する方法

答えて

35

スライダーを特定のポイントにスティックさせるには、viewControllerは、スライダーからリンクされたvalueChangedメソッドで、スライダーの値から適切な値を決定し、setValue:animated:を使用してスライダーを適切な場所。したがって、スライダが0から2に変化し、ユーザがスライダを0.75に変更した場合、スライダ値を1に設定し、スライダ値をそれに設定します。

+5

以下のようにNathanが言っているように、値を使うとドラッグすると点滅するので 'Touch up inside'を使用してください – Zenuka

+1

スライダーが連続している場合のみ適用されますが、その場合はより良い解決方法です – jrturton

60

私がここで取った手順は、jrturtonの答えに記載されている手順とほぼ同じでしたが、スライダは動きの後ろにある遅れをかなり目立ちます。これは私がこれをした方法です:

Interface Builderのビューにスライダーを置きます。 スライダの最小/最大値を設定します。これは、Interface Builderで、私は「タッチアップインサイドをフックアップした後

- (IBAction)sliderChanged:(id)sender 
{ 
    int sliderValue; 
    sliderValue = lroundf(mySlider.value); 
    [mySlider setValue:sliderValue animated:YES]; 
} 

:.Mファイルで

@property (strong, nonatomic) IBOutlet UISlider *mySlider; 
- (IBAction)sliderChanged:(id)sender; 

:.hファイルで

(Iは0と5を使用しました) 'イベントではなく、'値が変更されました '。これで、指が離されたときにスライダとスナップをスムーズに各整数に移動できます。

ありがとう@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

+2

ニース、丸めますlroundfは最も近い整数に丸めます。 –

+1

私はまた、 'Touch Up Outside' – Zenuka

5

私はこのためにした何をされます最初に現在のスライダ値の "出力"変数を整数(デフォルトでは浮動小数点数)に設定します。

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の倍数にジャンプします。

4

ネイサンが示唆したように、私がやったが、私もそう、ここで、リアルタイムに現在の値を表示する関連する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つのアクション(メソッド)をとります。

関連する問題