2011-01-12 9 views
15

Estoy usando un UISlider, se actualiza automáticamente, excepto que el usuario está tocando el botón deslizante. Por lo tanto, hice esto en la función que actualiza automáticamente por un NSTimer:UISlider events

if (!isSliderTouched) { 
    [progressSlider setValue: progressValue]; 
} 

¿Cómo puedo seguir el final de este evento, cuando el usuario suelta el dedo. Quiero establecer isSliderTouched siempre que el usuario interactúe con este control.

EDITAR: esto debería ser el terreno:

  1. beginns usuario draging/tocar UISlider =>isSliderTouched = SÍ
  2. usuario libera/Untouch la UISlider =>isSliderTouched = NO

Solución:

UIControlEventTouchDown 
UIControlEventTouchUpInside 
[progressSlider addTarget:self action:@selector(sliderMoveStart) forControlEvents:UIControlEventTouchDown]; 

aplausos endo

+0

He leído esto algunas veces y todavía no está claro para mí lo que quieres. Pero TouchUpInside es el evento que escucha cuando determina cuándo el usuario levanta el dedo. – madmik3

+0

intenté explicarlo mejor, consulte la actualización –

+0

TouchUpInSide se llama dos veces :( – AsifHabib

Respuesta

14

Se puede utilizar:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

para detectar cuando se producen los eventos touchDown y touchUp. Puede configurar su bandera en consecuencia.

Supongo por su fragmento de código que está utilizando un UISlider como medidor de progreso. ¿Has considerado usar UIProgressView en su lugar?

+0

thx, para su sugerencia. un UIProgressView no tiene un botón para deslizar, así que no es eso lo que necesito –

+1

parámetro continuo es lo que necesita http://developer.apple.com/library/ios/documentation/uikit/reference/UISlider_Class/Reference/Reference. html # // apple_ref/OCC/instp/UISlider/continua – serhats

+0

No está seguro alrededor de las normas sobre SO, sólo quería indicar a ustedes que hay una forma mejor de hacer esto para los controles UISlider. Ver mi respuesta – Geebs

1

cuando el usuario touchs el deslizador se podría establecer un indicador variable booleana y que sea NO. y en el método de actualización, compruebe si el indicador es SÍ o NO.

+0

creo que me entendió mal. Quiero que el usuario pueda usar el control deslizante, pero no que el proceso de actualización automática actualice mientras el usuario lo está usando –

+0

que tiene que usar el método valueChanged o una función que activará una función que está conectada a valueChanged – Robin

+0

no, cuando el usuario ha tocado el botón pero no se está moviendo. La actualización automática es la siguiente: –

6

Esto está marcado como resuelto y, sin embargo, me gustaría agregar otra solución a esto que considero más limpia.

if (!progressSlider.highlighted) { 
    [progressSlider setValue: progressValue]; 
} 
+0

Un par de personas votaron por esto por alguna razón. Tal vez debería haber explicado mejor: objetos UISlider tienen un "destacado" la propiedad que es SÍ cuando se presiona el control deslizante/arrastró. Puede usar esto directamente para calcular cuándo actualizar el valor y cuándo no. Si alguien quiere votar negativamente, hágamelo saber lo que piensa que está mal con la respuesta :) – Geebs

+0

Para mí, este método pareció detectar cuándo se presionó el control deslizante en vez de cuándo se lanzó. –

+0

Máx., En realidad proporciona el estado (tocado o no) en lugar de detectar eventos de prensa o liberación. La persona que hizo la pregunta quería establecer isSliderTouched en función de los eventos de inicio/finalización. Sugiero que puede usar la propiedad "resaltada" en lugar de crear isSliderTouched y averiguar el inicio y el final del toque. – Geebs

8

Una mejor forma de rastrear si el usuario ha terminado de interactuar con UISlider es utilizar un indicador continuo.

Si desea desencadenar una acción deslizante sólo después de que la acción se ha completado y el usuario ha movido el dedo de ella a continuación, utilizar

[blurSlider addTarget:self action:@selector(blurSliderChanged) forControlEvents:UIControlEventValueChanged]; 
    blurSlider.continuous = NO; 

De otro modo por defecto su conjunto a SÍ.

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