47 votes

iOS comment faire en sorte que le curseur s'arrête à des points discrets

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.

41voto

jrturton Points 64875

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.

4voto

NicolasMiari Points 2687

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.

0voto

sabiland Points 421

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

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