web-dev-qa-db-fra.com

Étapes de mise en œuvre / capture de UISlider

J'essaie d'implémenter une forme de capture ou des étapes avec UISlider. J'ai écrit le code suivant mais cela ne fonctionne pas aussi bien que je l'espérais. Cela fonctionne, mais lorsque je le fais glisser vers le haut, il s'accroche à 5 points vers la droite en laissant le doigt non centré sur le "cercle coulissant"

Ceci est mon code où self.lastQuestionSliderValue est une propriété de la classe que j'ai définie à la valeur initiale du curseur.

    if (self.questionSlider.value > self.lastQuestionSliderValue) {
        self.questionSlider.value += 5.0;
    } else {
        self.questionSlider.value -= 5.0;
    }

    self.lastQuestionSliderValue = (int)self.questionSlider.value;
44
LuckyLuke

C'est en fait beaucoup plus facile que je ne le pensais. À l'origine, j'essayais d'obtenir la propriété thumbrect et de faire des mathématiques compliquées. Voici ce que j'ai fini avec:

h Fichier:

@property (nonatomic, retain) IBOutlet UISlider* questionSlider;
@property (nonatomic) float lastQuestionStep;
@property (nonatomic) float stepValue;

m Fichier:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Set the step to whatever you want. Make sure the step value makes sense
    //   when compared to the min/max values for the slider. You could take this
    //   example a step further and instead use a variable for the number of
    //   steps you wanted.
    self.stepValue = 25.0f;

    // Set the initial value to prevent any weird inconsistencies.
    self.lastQuestionStep = (self.questionSlider.value) / self.stepValue;
}

// This is the "valueChanged" method for the UISlider. Hook this up in
//   Interface Builder.
-(IBAction)valueChanged:(id)sender {
    // This determines which "step" the slider should be on. Here we're taking 
    //   the current position of the slider and dividing by the `self.stepValue`
    //   to determine approximately which step we are on. Then we round to get to
    //   find which step we are closest to.
    float newStep = roundf((questionSlider.value) / self.stepValue);

    // Convert "steps" back to the context of the sliders values.
    self.questionSlider.value = newStep * self.stepValue;
}

Assurez-vous de brancher la méthode et la sortie de votre vue UISlider et vous devriez être prêt à partir.

132
FreeAsInBeer

La solution la plus simple pour moi était juste

- (IBAction)sliderValueChanged:(id)sender {
    UISlider *slider = sender;
    slider.value = roundf(slider.value);
}
20
Adam Johns

Peut-être que quelqu'un aura besoin! Dans ma situation, j'avais besoin d'une étape entière, j'ai donc utilisé le code suivant:

-(void)valueChanged:(id)sender {
    UISlider *slider = sender;
    slider.value = (int)slider.value;
}
7
rusBogun

VERSION Swift

Exemple: vous voulez qu'un curseur passe de 1-10000 par pas de 100. La configuration d'UISlider est la suivante:

slider.maximumValue = 100
slider.minimumValue = 0
slider.continuous = true

Dans l'action func () pour le curseur, utilisez:

var sliderValue:Int = Int(sender.value) * 100
6
Pescolly

Une autre Swift approche consiste à faire quelque chose comme

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

}
4
Jure

Un très simple:

- (void)sliderUpdated:(UISlider*)sli {
    CGFloat steps = 5;
    sli.value = roundf(sli.value/sli.maximumValue*steps)*sli.maximumValue/steps;    
}

Idéal si vous voulez une solution rapide et que vous avez ajouté la cible par UIControlEventValueChanged.

3
Leonard Pauli