2012-09-03 11 views
10

Tengo UIViewController en mi proyecto simple de storyboard IPad que contiene UIScrollView que se coloca sobre toda la superficie (1024 x 768). He creado 3 XI ​​ter archivos que son los que UIViews mis cargas de aplicaciones en el arranque en viewDidLoad y añadirlos en UIScrollView. Cada uno de estos 3 archivos XIB contiene solo un UIButton.Detectar evento táctil en UIScrollView Y en los componentes de UIView [que se encuentra dentro de UIScrollView]

Esto es jerarquía:

~ UIViewController (UIViewControllerClass es la clase para este UIViewController)

~~ UIScrollView (contiene 3 UIViews idéntico)

~~~ UIView (UIViewClass es propietario del archivo para este archivo XI ter)

~~~~ UIButton

me gustaría que mi UIViewControllerClass se da cuenta de ambos: toque en cualquier parte componente UIScrollView Y si UIScrollView se toca, si UIButton interior de UIView en UIScrollView se toca, al tener información que exactamente eso se toca el botón.

Realicé IBAction dentro de UIViewClass para tocar en UIButton dentro de UIView en UIScrollView y cuando establezco User Interaction Enabled = YES en todos los elementos (UIViewController, UIView y UIScrollView) este método se llama como debería.

Pero en este punto mi UIViewControllerClass no es consciente de que toque ocurrió dentro UIScrollView en ese UIButton. Hice el reconocedor de contacto de esta manera:

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)]; 
touch.numberOfTouchesRequired = 1; 

y lo agregué al componente UIScrollView. De esta manera soy capaz de detectar eventos táctiles en el componente UIScrollView en UIViewControllerClass, pero controlador de eventos táctil para UIButton en UIView que se encuentra dentro UIScrollView no se llama más.

Por lo tanto, necesita tener estas dos informaciones en UIViewControllerClass: Se ha

  • táctil en el componente UIScrollView
  • Touch en UIButton en UIView que se encuentra dentro UIScrollView (si este botón se tocó) se hizo

Supongo que asociar el reconocimiento de eventos táctiles a todo el componente UIScrollView no es una solución, ya que desactiva todos los controladores de eventos táctiles que escribí dentro de UIViewClass.

Creo que la solución es que de alguna manera los toques que se realizan en los componentes de UIView dentro de UIScrollView deben enviarse a UIViewControllerClass, pero no encontré la manera de hacerlo.

Si alguien me puede ayudar, estaría muy agradecido. Gracias por adelantado.


[editar # 1: Respuesta por Zheng]

Tap gesto debe tener cancelsTouchesInView opción se ajusta a NO!

Por mi caso anterior, esta línea soluciona todo:

touch.cancelsTouchesInView = NO; 

Muchas gracias a Zheng.

Respuesta

17

No sé si esto funciona para usted o no, pero me he dado una respuesta acerca de eventos de toque para las vistas dentro ScrollView aquí:

Dismissing the keyboard in a UIScrollView

La idea es contar la ScrollView no para tragar todos los gestos de toque dentro del área de vista de desplazamiento.

voy a pegar aquí de todos modos, espero que solucione el problema:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; 

// prevents the scroll view from swallowing up the touch event of child buttons 
tapGesture.cancelsTouchesInView = NO;  

[pageScrollView addGestureRecognizer:tapGesture]; 

[tapGesture release]; 

... 

// method to hide keyboard when user taps on a scrollview 
-(void)hideKeyboard 
{ 
    [myTextFieldInScrollView resignFirstResponder]; 
} 
+0

¡Muchas gracias! Este problema tuyo no está relacionado con el mío, pero contiene una línea MUY importante para mí con la opción No sabía que UITapGestureRecognizer tiene - cancelsTouchesInView. No sabía que esta opción está establecida en SÍ de forma predeterminada, y ahora cuando lo configuro como NO, puedo detectar el toque en UIScrollView y también si el elemento que se toca dentro de UIScrollView tiene su controlador táctil, ese controlador está siendo llamado también. Gracias una vez más, resolvió mi problema con esa línea. – uerceg

3

Puede subclasificar su UIScrollView y anular el método - hitTest:withEvent: que el sistema llama para determinar qué vista manejará el evento. Siempre que se invoca, puede suponer que se produjo un evento táctil dentro de la vista de desplazamiento, y al llamar a la implementación súper, puede obtener la vista que normalmente procesará el evento.

+0

Muchas gracias por la respuesta, pero controlado para las respuestas en mi pregunta cuando Zhang también me respondió y probé su solución que funcionó para mí. Gracias una vez más! – uerceg

+0

Esta debería ser la carta correcta. – HongchaoZhang

+0

¿Puedes dar un ejemplo de esto en el código? – user6631314

0

que puede capturar cualquier tipo de gestos en el UIScrollView. Asegúrese de que también maneja algunas de las propiedades predeterminadas, así como establecer la propiedad cancelsTouchesInView en false, es verdadera de manera predeterminada. También proporcione algunos nodos de etiqueta a sus vistas secundarias para distinguirlos en selectores. & también permiten que su interacción del Usuario sea verdadera.

Let grifo = UITapGestureRecognizer (objetivo: uno mismo, la acción:

selector (didTapByUser (_ :)))

Cuestiones relacionadas