Detecta el evento táctil en UIScrollView Y en los componentes de UIView

Tengo UIViewController en mi proyecto IPad de storyboard simple que contiene UIScrollView que se coloca sobre toda la superficie (1024 x 768). He creado 3 files XIB que son UIViews que mi aplicación carga al inicio en viewDidLoad y los agrega a UIScrollView. Cada uno de estos 3 files XIB contiene solo un button UIB.

Esta es la jerarquía:

~ UIViewController ( UIViewControllerClass es class para este UIViewController)

~~ UIScrollView (contiene 3 UIViews idénticas)

~~~ UIView ( UIViewClass es el propietario del file para este file XIB)

~~~~ UIButton

Me gustaría que mi UIViewControllerClass tenga conocimiento de ambos: tocar en cualquier lugar en el componente UIScrollView Y si UIScrollView se toca, si se toca el button UIB dentro de UIView en UIScrollView, para tener información que toque exactamente ese button.

Hice IBAction dentro de UIViewClass para tocar en UIB el button dentro de UIView en UIScrollView y cuando establecí Interaction User 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 sabe que el tacto ocurrió dentro de UIScrollView en ese UIButton. Hice el reconocimiento táctil de esta manera:

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

y lo agregó al componente UIScrollView. De esta manera, puedo detectar el evento táctil en el componente UIScrollView en UIViewControllerClass, pero toque el manejador de events para el UIButton en UIView que está dentro de UIScrollView ya no se llama.

Entonces, necesito tener estas dos informaciones en UIViewControllerClass:

  • Touch en el componente UIScrollView se realizó
  • Toca el button UIB en UIView que está dentro de UIScrollView (si este button fue tocado) fue hecho

Supongo que adjuntar el reconocimiento de events táctiles a todo el componente UIScrollView no es una solución, ya que deshabilita todos los manejadores de events táctiles que escribí dentro de UIViewClass.

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

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


[editar n. ° 1: RESPUESTA de Zheng]

¡El gesto de toque debe tener la opción cancelsTouchesInView establecida en NO !

Para mi caso anterior, esta línea lo resuelve todo:

 touch.cancelsTouchesInView = NO; 

Muchas gracias a Zheng.

No sé si esto funciona para usted o no, pero he dado una respuesta sobre los events táctiles para las vistas dentro de scrollview aquí:

Descartar el keyboard en una UIScrollView

La idea es decirle a scrollView que no se trague todos los gestos de pulsación dentro del área de vista de desplazamiento.

Voy a pegar el código aquí de todos modos, es de esperar que solucione tu 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]; } 

Puede subclasificar su UIScrollView y anular el método - hitTest:withEvent: el sistema lo - hitTest:withEvent: para determinar qué vista controlará el evento. Cada vez que se llama, puede suponer que se produjo un evento táctil dentro de la vista de desplazamiento, y llamando a la superimplementación, puede get la vista que normalmente procesaría el evento.

puede capturar cualquier tipo de gestos en UIscrollView. Asegúrese de que también maneja algunas de las properties pnetworkingeterminadas, así como establecer la propiedad cancelsTouchesInView en falso, es verdadero de forma pnetworkingeterminada. También asigne algunas tags a sus sub vistas para distinguirlas en los selectores. y también habilita su interacción del Usuario a verdadero.

dejar tap = UITapGestureRecognizer (objective: self, acción:

selector (didTapByUser (_ :)))