Je voudrais arrêter le curseur à des points discrets qui représentent des nombres entiers sur une chronologie. Quelle est la meilleure façon de procéder ? Je ne veux pas de valeurs entre les deux. Ce serait formidable si le curseur pouvait également "s'enclencher" pour se positionner à chaque point discret.
Réponses
Trop de publicités?Pour que le curseur "colle" à des points spécifiques, votre viewcontroller doit, dans la méthode valueChanged liée à du curseur, déterminer l'arrondi approprié à partir de la valeur du curseur, puis utiliser setValue:animated: pour déplacer le curseur à l'endroit approprié. Ainsi, si votre curseur passe de 0 à 2 et que l'utilisateur le modifie à 0,75, vous supposez que cela devrait être 1 et définissez la valeur du curseur sur celle-ci.
J'ai fait comme Nathan l'a suggéré, mais je souhaite également mettre à jour un UILabel
associé affichant la valeur actuelle en temps réel, alors voici ce que j'ai fait :
- (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];
}
}
L'inconvénient, bien sûr, est qu'il faut deux actions (méthodes) par curseur.
Version Swift avec ValueChanged et TouchUpInside .
EDIT : En fait, vous devriez connecter 3 événements dans ce cas :
yourSlider.addTarget(self, action: #selector(presetNumberSliderTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
Je viens de coller mon code, mais vous pouvez facilement voir comment c'est fait.
private func setSizesSliderValue(pn: Int, slider: UISlider, setSliderValue: Bool)
{
if setSliderValue
{
slider.setValue(Float(pn), animated: true)
}
masterPresetInfoLabel.text = String(
format: TexturingViewController.createAndSendPresetNumberNofiticationTemplate,
self.currentPresetNumber.name.uppercased(),
String(self.currentPresetNumber.currentUserIndexHumanFriendly)
)
}
@objc func presetNumberSliderTouchUp(_ sender: Any)
{
guard let slider = sender as? NormalSlider else{
return
}
setupSliderChangedValuesGeneric(slider: slider, setSliderValue: true)
}
private func setupSliderChangedValuesGeneric(slider: NormalSlider, setSliderValue: Bool)
{
let rounded = roundf((Float(slider.value) / Float(presetNumberStep))) * Float(presetNumberStep)
// Set new preset number value
self.currentPresetNumber.current = Int(rounded)
setSizesSliderValue(pn: Int(rounded), slider: slider, setSliderValue: setSliderValue)
}
@IBAction func presetNumberChanged(_ sender: Any)
{
guard let slider = sender as? NormalSlider else{
return
}
setupSliderChangedValuesGeneric(slider: slider, setSliderValue: false)
}