2010-03-25 12 views

Respuesta

150

Añadir un objetivo como éste:

slider.continuous = YES; 
[slider addTarget:self 
     action:@selector(valueChanged:) 
     forControlEvents:UIControlEventValueChanged]; 

Y en la función valueChanged establece el valor en el valor más cercano que es divisible por 5.

[slider setValue:((int)((slider.value + 2.5)/5) * 5) animated:NO]; 
+0

me siento honestamente estúpidos. es alw Ays las cosas simples que me atrapan. –

+1

Gracias, evítenme pensar mucho al respecto ^^ Sin embargo, hice un ligero cambio: int increment = 10; [numberOfAppsInFutur setValue: ((int) ((numberOfAppsInFutur.value + increment/2.)/Increment) * increment) animated: NO]; –

+0

En caso de que ayude, hay un ejemplo completo [aquí] (http://stackoverflow.com/a/8219848/168594). – zekel

5

Hay otra manera de activar el paso a paso funcionalidad. funciona en un caso general

Ejemplo:

gama de datos sea de 0 - 2800 y Quiero los incrementos para estar en 25 valores unitarios. Haría lo siguiente

  1. configure el rango del control deslizante para que sea 0 - (maxRange/unitsteps).
  2. cuando el método de valor cambiado se ejecuta use (int) slider.value * unitsteps.

en el ejemplo anterior mi deslizador se establecería en el IB en un rango 0 - 112. y mi código sería (int) * 25. slider.value

si a continuación, tiene un campo de texto se puede modificar para la entrada directa, simplemente se haría lo contrario, establecer el valor del control deslizante en [textfield.text intValue]/unitsteps.

+0

un efecto secundario de esto es que puede ayudar a imponer límites al valor del campo de texto ... –

+0

Me pareció una solución perfecta. – Umair

5

Para aquellos que buscan la sintaxis 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) 
} 

Alternativamente, basta con crear una función de Acción con el Editor Asistente (lo que hice en última instancia) ...

@IBAction func mySliderValueChanged(sender: UISlider) { 
    //Set value to the nearest int 
    sender.setValue(Float(roundf(sender.value)), animated: false) 

} 
27

Un poco solución más elegante en Swift podría ser algo como esto

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 esta manera obtienes ste ps de 5. Puede leer más sobre la configuración en mi post.

-4
1. In storyboard mode, drag and drop a stepper and label. the label will show the stepper values. 
  1. clic izquierdo y arrastre tanto etiqueta y paso a paso a su controlador de vista como puntos de venta.

nombre de etiqueta como "stepperValue"

  1. arrastrar y soltar paso a paso de nuevo lo que es una fun- Llamé mina "FUNC"

@IBAction func inc (remitente: AnyObject) {
stepperValue.text = "(Int (stepper.valor) * 5)"

haga clic en el paso a paso y que se incrementará en un 5

+1

Por favor, edite su respuesta para una mayor legibilidad. –

4

en Swift 3, slider con incrementos de +/- 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)") 

}