web-dev-qa-db-fra.com

UISlider avec incréments de 5

Comment puis-je faire passer mon UISlider de 1-100 par incréments de 5?

67
Tyler29294

Ajoutez une cible comme celle-ci:

slider.continuous = YES;
[slider addTarget:self
      action:@selector(valueChanged:) 
      forControlEvents:UIControlEventValueChanged];

Et dans la fonction valueChanged, définissez la valeur sur la valeur la plus proche divisible par 5.

[slider setValue:((int)((slider.value + 2.5) / 5) * 5) animated:NO];

Donc, si vous avez besoin d'un intervalle autre que 5, définissez-le simplement comme suit:

float interval = 5.0f;//set this
[slider setValue:interval*floorf((slider.value/interval)+0.5f) animated:NO];
158
Tuomas Pelkonen

Une solution légèrement plus élégante dans Swift pourrait être quelque chose comme ça

let step: Float = 5
@IBAction func sliderValueChanged(sender: UISlider) {
  let roundedValue = round(sender.value / step) * step
  sender.value = roundedValue
  // Do something else with the value

}

De cette façon, vous obtenez des étapes de 5. Vous pouvez en savoir plus sur la configuration dans mon post .

48
Jure

Il existe une autre façon d'activer la fonctionnalité pas à pas. fonctionne dans un cas général

Exemple:

la plage de données est comprise entre 0 et 2800 et je souhaite que les incréments soient en 25 valeurs unitaires. Je ferais ce qui suit

  1. définissez la plage du curseur sur 0 - (maxRange/unitsteps).
  2. lorsque la méthode de modification de la valeur s'exécute, utilisez (int) slider.value * unitsteps.

dans l'exemple ci-dessus, mon curseur serait défini dans IB sur une plage de 0 à 112. et mon code serait (int) slider.value * 25.

si vous avez alors un champ de texte qui peut être modifié pour une entrée directe, vous feriez simplement l'inverse définissez la valeur du curseur sur [textfield.text intValue]/unitsteps.

9
MB.

Pour tous ceux qui recherchent la syntaxe Swift ...

override func viewDidLoad() {
    super.viewDidLoad()
    mySlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
}

func sliderValueDidChange(sender:UISlider!)
{
    //Set value to the nearest 5...
    print((Float)((Int)((sender.value + 2.5) / 5) * 5))
    sender.setValue((Float)((Int)((sender.value + 2.5) / 5) * 5), animated: false)
}

Alternativement, il suffit de créer une fonction Action avec l'éditeur adjoint (ce que j'ai finalement fait) ...

@IBAction func mySliderValueChanged(sender: UISlider) {
    //Set value to the nearest int
    sender.setValue(Float(roundf(sender.value)), animated: false)

}
6
Justin Domnitz

Dans Swift 3, curseur avec incréments +/- 7:

@IBOutlet weak var sldComponent: UISlider!

...

sldComponent.addTarget(self, action:  #selector(_sldComponentChangedValue),for: .valueChanged)

...

func _sldComponentChangedValue(sender: UISlider!) {

        self.sldComponent.setValue((round(sender.value / 7) * 7), animated: false)
        print("\(sender.value)")

}