iphone - suena - iOS cómo hacer que el deslizador se detenga en puntos discretos
mi alarma no suena iphone (4)
Hice lo que sugirió Nathan, pero también quiero actualizar un UILabel
asociado que muestre el valor actual en tiempo real, así que esto es lo que hice:
- (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];
}
}
El inconveniente, por supuesto, es que se necesitan dos acciones (métodos) por control deslizante.
Me gustaría hacer que un control deslizante se detenga en puntos discretos que representan números enteros en una línea de tiempo. ¿Cuál es la mejor manera de hacer esto? No quiero ningún valor en el medio. Sería fantástico si el control deslizante pudiera "ajustarse" a la posición en cada punto discreto también.
Lo que hice para esto es establecer primero una variable de "salida" del valor del control deslizante actual a un número entero (es un valor flotante por defecto). A continuación, establezca el número de salida como el valor actual del control deslizante:
int output = (int)mySlider.value;
mySlider.value = output;
Esto lo configurará para moverse en incrementos de 1 enteros. Para hacer que se mueva en un rango específico de números, por ejemplo, en 5s, modifique su valor de salida con la siguiente fórmula. Agregue esto entre las primeras dos líneas de arriba:
int output = (int)mySlider.value;
int newValue = 5 * floor((output/5)+0.5);
mySlider.value = newValue;
Ahora su control deslizante "salta" a múltiplos de 5 a medida que lo mueve.
Los pasos que tomé aquí eran más o menos los mismos que los que figuran en la respuesta de jrturton, pero descubrí que el control deslizante se retrasaba un poco más que mis movimientos. Así es como hice esto:
Coloque el control deslizante en la vista en Interface Builder. Establezca los valores min / max del control deslizante. (Usé 0 y 5)
En el archivo .h:
@property (strong, nonatomic) IBOutlet UISlider *mySlider;
- (IBAction)sliderChanged:(id)sender;
En el archivo .m:
- (IBAction)sliderChanged:(id)sender
{
int sliderValue;
sliderValue = lroundf(mySlider.value);
[mySlider setValue:sliderValue animated:YES];
}
Después de esto, en Interface Builder conecté el evento ''Touch Up Inside'' para el deslizador al propietario del archivo, en lugar de ''Value Changed''. Ahora me permite mover suavemente el control deslizante y ajustar a cada número entero cuando mi dedo se levanta.
Gracias @jrturton!
ACTUALIZACIÓN - Swift:
@IBOutlet var mySlider: UISlider!
@IBAction func sliderMoved(sender: UISlider) {
sender.setValue(Float(lroundf(mySlider.value)), animated: true)
}
Además, si hay alguna confusión sobre conectar cosas en el guión gráfico, he cargado un ejemplo rápido a github: https://github.com/nathandries/StickySlider
Para hacer que el control deslizante se "adhiera" en puntos específicos, su controlador de vista debería, en el método valueChanged vinculado desde el control deslizante, determinar el redondeo apropiado del valor del control deslizante y luego usar setValue: animado: para mover el control deslizante al lugar apropiado. Entonces, si su control deslizante pasa de 0 a 2, y el usuario lo cambia a 0.75, usted asume que debe ser 1 y establece el valor del control deslizante a eso.