52 votes

Étapes de mise en œuvre / capture d'UISlider

J'essaie d'implémenter une forme de capture ou d'é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 se casse de 5 points vers la droite en laissant le doigt non centré sur le "cercle de diapositives".

Ceci est mon code où self.lastQuestionSliderValue est une propriété de la classe que j'ai définie sur 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;
 

138voto

FreeAsInBeer Points 9791

C'est en fait considérablement plus facile que je pensais au départ. A l'origine, j'essayais d'obtenir la propriété thumbrect et de faire des calculs compliqués. Voici ce que j'ai fini avec:

h Fichier:

 @property (nonatomic, retain) IBOutlet UISlider* questionSlider;
@property (nonatomic) int lastQuestionStep;
@property (nonatomic) int 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 connecter la méthode et la prise pour votre vue UISlider et vous devriez être prêt à partir.

8voto

rusBogun Points 98

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;
}
 

4voto

Leonard Pauli Points 1096

Un très simple:

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X