UIPanGestureRecognizer.maximumNumberOfTouches no se respeta en las vistas de desplazamiento anidadas?

Tengo un UIScrollView raíz que solo se desplaza verticalmente, este scrollview representa filas en mi grilla dentada. He configurado el reconocimiento de gestos de paneo de esta vista de desplazamiento para dos toques, tanto para el número mínimo como para el máximo de toques.

Dentro de este scrollview tengo una o más instancias de UIScrollView que solo se desplazan horizontalmente, estas vistas de desplazamiento representan cada una una sola fila en mi vista de grilla dentada. He configurado los reconocedores de gestos panorámicos para todas estas vistas de desplazamiento para un mínimo de un toque y dos toques máximos.

Hasta el momento funciona, obtengo una bonita vista de cuadrícula dentada donde puedo desplazarme verticalmente entre filas, y horizontalmente para desplazarme por cada fila de forma independiente. Establecí intencionalmente el número mínimo de toques como 2, como para no temer con desplazamiento si agrego para un ejemplo UITableView como una subvista para cualquier celda dentro de esta vista de cuadrícula irregular (celda == una position definida por una fila y columna en esa fila).

Usar una UITableView como célula funciona, la vista de tabla funciona como se espera que sea. Pero el desplazamiento con dos dedos también se desplaza dentro de la vista de tabla, no en la vista de desplazamiento raíz para desplazarse verticalmente entre filas.

He intentado configurar el reconocimiento de gestos panorámico de vistas de tabla para permitir un máximo de un toque, con la esperanza de que se ignoren dos toques de dedo. Esto no funciona, la propiedad maximumNumberOfTouches de las costuras del reconocedor de gestos de pan de la vista de tabla debe ignorarse.

¿Qué podría haber hecho mal?

Una captura de pantalla que muestra el layout para aclarar lo que he hecho: Jagged Grid View http://i44.tinypic.com/33u96yv.png

El desplazamiento múltiple tiende a ser complicado, y no estoy seguro, pero creo que Apple no alienta esto. Aún así, sigo pensando que es posible. Puede ser que el desplazamiento vertical en la vista de la tabla se mezcle con el desplazamiento vertical de la vista de desplazamiento u otra cosa.

Intenta verificar si los delegates para los reconocedores de gestos están correctamente configurados. Otra forma de evitar esto es: – Tener una vista de desplazamiento con botones, desde la que puede abrir los popovers con controlleres personalizados (inserte allí lo que quiera). – Cree un gran UITableViewController y configure los contenidos de la celda como scrollviews, etc. Creo que podría get el mismo resultado.

Mi consejo es que no se quede atrapado en un solo método, cuando podría haber otros más simples y más intuitivos.

Las vistas de tabla en las vistas de desplazamiento generalmente no son una gran idea. Cuando un TableView recibe los toques, incluso si no necesita hacer nada con él, no los enviará a su superView.

Es posible que desee probar cualquiera de estas 2 cosas:

  1. En su TableView, debe enviar los toques a su superView manualmente y permitirles manejarlos de manera adecuada. He visto que este método se utiliza en uno de mis proyectos secundarios, pero no puedo publicar un ejemplo en este momento.

  2. La segunda cosa podría ser más fácil de implementar. Como TableView es una subclass de ScrollView, puede invocar los delaysContentTouches de esos TableViews. Esta propiedad retrasará el toque incluso en ese TableView hasta que pueda determinar si el desplazamiento es el bash, como está escrito en los AppleDocs: http://developer.apple.com/library/ios/#documentation/uikit/reference/ UIScrollView_Class / Referencia / UIScrollView.html # // apple_ref / occ / cl / UIScrollView

Avíseme si cualquiera de las 2 maneras funciona para usted, tengo mucha curiosidad sobre este tema en general.

Pero no intentes algunos trucos en lugar de implementar todos estos cambios:

1) De forma pnetworkingeterminada, deshabilite el desplazamiento de TableView cuando se crea la vista.

2) Una vez que se genera la vista, reconozca los gestos, ya sea su desplazamiento con uno o varios toques, si el usuario toca la vista de desplazamiento de niño. Vea la label, en function de los gestos, puede habilitar el desplazamiento de Tableview.

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { //Get the tag of ScrollView // Check for the Parent as well as Child SCrollview. // If its child, just enable the scrolling of tableView. } - (void)tapAction:(UIGestureRecognizer *)gestureRecognizer { // CGPoint *poit = [Tile locationInView:gestureRecognizer.view]; /// [[[gestureRecognizers.view] objectAtIndex:0] removeFromSuperview]; // imageContent = [[UIImageView alloc]initWithFrame:CGRec tMake(0, 0, 200, 250)]; // [imageContent setImage:[UIImage imageNamed:@"Default.png"]]; NSLog(@"You tapped @ this :%d",gestureRecognizer.view.tag); //Regonize the gestures } 

Puede haber algún código innecesario, ya que no hay ningún fragment de código con su pregunta. Di una oportunidad y mostró un truco si eso podría funcionar para usted y resolver el problema. 😉

Pruebe este enlace y preste atención a cómo resuelven las vistas anidadas.

Recuerde las mejores prácticas para manejar events multitáctiles:

Al manejar events, tanto events táctiles como de movimiento, hay algunas técnicas y patrones recomendados que debe seguir.

  • Siempre implementa los methods de cancelación de events.

En su implementación, debe restaurar el estado de la vista a lo que era antes de la secuencia multitáctil actual, liberando cualquier recurso transitorio configurado para manejar el evento. Si no implementa el método de cancelación, su vista podría quedar en un estado inconsistente. En algunos casos, otra vista podría recibir el post de cancelación.

  • Si maneja events en una subclass de UIView, UIViewController, o (en casos excepcionales) UIResponder,

    • Debe implementar todos los methods de event handling events (incluso si se trata de una implementación nula).

    • No llame a la implementación de superclass de los methods.

  • Si manejas events en una subclass de cualquier otra class de respuesta de UIKit,

    • No tiene que implementar todos los methods de event handling events.

    • Pero en los methods que implementas, asegúrate de llamar a la implementación de la superclass. Por ejemplo,

[super touchesBegan: theTouches withEvent: theEvent];

  • No reenvíe events a otros objects de respuesta del marco UIKit.

Los respondedores a los que reenvía los events deberían ser instancias de sus propias subclasss de UIView, y todos estos objects deben saber que el reenvío de events se lleva a cabo y que, en el caso de los events táctiles, pueden recibir toques que no están vinculados a ellos.

  • Las vistas personalizadas que se vuelven a dibujar en respuesta a los events solo deben establecer el estado de dibujo en los methods de event handling events y realizar todo el dibujo en el método drawRect: method.

  • No envíe explícitamente events al respondedor (a través de nextResponder); en su lugar, invoque la implementación de la superclass y permita que el UIKit maneje el recorrido de la cadena de respuesta.