2012-06-12 14 views
10

Tengo un UISlider (vertical) dentro de un UIScrollview. Me gustaría poder cambiar el valor del control deslizante y, sin levantar el dedo, desplazar la vista de desplazamiento hacia la izquierda o hacia la derecha.Tocar en UISlider evita el desplazamiento de UIScrollView

comportamiento deseado:

táctil abajo dentro UISlider vertical, seguido de un lastre dedo hacia la izquierda o hacia la derecha hace que el ScrollView para desplazarse

comportamiento real:

táctil abajo dentro UISlider verticales , seguido de arrastrar el dedo hacia la izquierda o hacia la derecha no causa movimiento en UIScrollview. Un toque hacia abajo fuera de el UISlider seguido de un arrastre desplazará la vista de desplazamiento como se esperaba

UIView tiene una propiedad llamada exclusiveTouch que parece estar relacionada con mi problema. Intenté configurarlo para NO, sin suerte.

Entonces, ¿cómo puede configurar mis UISliders para que la vista de desplazamiento debajo de ellos responda a los toques que se originan dentro de los UISliders?

+5

+1 para el resultado deseado/esperado frente al resultado real. Más preguntas deberían hacer esto. –

Respuesta

4

¿Has probado la subclasificación de UIScrollView y la implementación de - (BOOL)touchesShouldCancelInContentView:(UIView *)view?De acuerdo con la documentación de Apple:

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

Si simplemente regresa NO si el view es su UISlider, esto puede hacer lo que quiera, asumiendo sus UIScrollView sólo se desplaza horizontalmente. Si esto no funciona, es probable que tenga que realizar un manejo táctil personalizado (es decir, sobrescribir touchesBegan:withEvent:, touchesChanged:withEvent:, etc.) tanto para su UIScrollView como para su UISlider.

+0

Hizo el truco. ¡Gracias! – morgancodes

2

Lo que está viendo es el comportamiento previsto.

Cada evento táctil solo lo maneja un control. Lo que hace exclusiveTouch es evitar que otros eventos táctiles se envíen a otras vistas.

Para hacer lo que están tratando de hacer, usted tendría que hacer parte del manejo táctil usted mismo. Pasar el evento a ambos puntos de vista. Puede hacerlo ejecutando todos los métodos touchesBegan:, touchesMoved: etc. y pasar los eventos a ambas vistas. Puede leer más sobre ese enfoque en el UIResponder documentation. Otro enfoque es hacer el manejo del evento en un UIGestureRecognizer en la vista de desplazamiento que golpea el control deslizante y actualiza el valor del control deslizante usando el y-delta. Puede leer más sobre los reconocedores de gestos y el manejo de eventos en the section about Gesture Recognizers in the Event Handling Guide for iOS.


Nota al margen:

Ir a la aplicación Ajustes y alternar un interruptor de la mitad del camino (por ejemplo, el modo de cambio de avión) y arrastre hacia abajo. Nada pasará. El resto del sistema operativo se comporta de la misma manera. ¿Estás seguro de que esta es la interacción que realmente quieres hacer? Las aplicaciones que se comportan de manera diferente a menudo se sienten raras y poco familiares.

+0

+1 por "Para hacer lo que está intentando hacer, tendrá que hacer parte del manejo táctil". – morgancodes

+0

@morgancodes Sí, probablemente un poco vago. Agregué dos alternativas básicas y enlaces a documentación relevante sobre cómo hacer su propio manejo táctil. –

1

Tu pregunta me ha confundido un poco. ¿Estás diciendo un control deslizante vertical, pero arrastrando hacia la izquierda y hacia la derecha?

Si desea desplazar la ScrollView al arrastrar el UISlider, la forma correcta de hacerlo es

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

y

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

Hope esto es lo que desea.

+0

Gracias por su respuesta, pero esto no es lo que estoy pidiendo. Estoy intentando descubrir cómo permitir que el evento touchesMoved se aplique al UIScrollview, no solo al UISlider dentro de la vista de desplazamiento. Quiero un arrastre vertical para cambiar el valor del control deslizante y un arrastre horizontal para cambiar la posición de UIScrollview, como lo haría si no hubiera un control deslizante vertical en el camino. – morgancodes

0

Creo que puede obtener alguna referencia del ejemplo this en este ejemplo se muestra cómo cancelar cualquier toque o cualquier reconocedor de gestos y aplicarlos a otras vistas.

mayo de este cable que a la solución de su problema y si sólo me avisará de ello

feliz :) Codding

1

Es necesario establecer delaysContentTouches como NO y evitar que los objetos UISlider para desplazarse , Verifique el código a continuación.

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
} 
Cuestiones relacionadas