Comment puis-je faire passer mon UISlider
de 1-100
par incréments de 5
?
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];
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 .
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
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.
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)
}
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)")
}