2012-10-04 31 views
6

Estoy a punto de desesperarme tratando de lograr algo tan simple.Detener UITableView consumir eventos táctiles por lo que el menú deslizante en la vista principal puede detectar golpes horizontales

Tengo una vista con un menú que, al usar las funciones touchEvents, se desliza desde la izquierda cuando se hace un gesto para hacerlo con un deslizamiento horizontal. No uso reconocedores de gestos, simplemente utilizo los toques Bean, touchesMoved, etc. y rastrear la diferencia de coordenadas x entre la posición táctil inicial, las posiciones intermedias y la posición táctil final. Funciona muy bien.

Pero, cuando en el cuerpo tengo una UITableView, los eventos táctiles ya no encuentran su camino en la jerarquía hasta la vista que administra el menú. Traté de evitar esto pasando toques a superview/nextResponder, que funciona, pero veo un touchesBegan y 2 toques de llamadas modificadas antes de que simplemente deje de procesarse más arriba en la jerarquía.

En concreto, tengo un SlideMenuView, en el que hay una vista de menú y una vista del cuerpo. Dentro de la vista del cuerpo, tengo en algún punto el UITableView. Veo (a través de NSLog) que los métodos toques * se llaman de principio a fin sin problemas. Los paso a nextResponder y los veo en SlideMenuView también, pero después de 2 llamadas a touchesMoved, parecen detenerse en SlideMenuView pero continuar en mi UITableView.

Estoy anulando el UITableView para hacer esto, pero no he cambiado nada más dentro de él.

Sé que esto debe ser posible, ya que está en la aplicación de Facebook. Puede deslizar en cualquier parte del cuerpo, que se puede desplazar horizontalmente y revelar el menú. Quiero que ocurra lo mismo de forma natural aquí, pero parece que algo extraño está sucediendo, y UITableView está consumiendo o destruyendo los eventos.

¿Alguien puede ayudarme con esto? Alguien debe haber logrado esto de una manera limpia.

+0

¿Hay algún motivo por el que no pueda usar los reconocedores de gestos? Creo que esto sería más fácil de lograr si pudieras hacerlo. – rdelmar

Respuesta

9

Bien, para cualquier persona interesada, encontré una solución limpia.

Apple sabe lo que están haciendo. En el pasado, solíamos anular touchesBegan, ... pero luego introdujeron GestureRecognizers. Para algunos controles, como el UIScrollView (y cualquier subclase, como UITableView), parecen dañar su sistema de respuesta a eventos. Tuve la culpa de suponer que el Gesture Recognizers no hace nada especial, y simplemente engancharme a estos touchesBegan, ... métodos: esto no es correcto.

La manera más segura es usar el Gesture Recognizers. Específicamente, hay algunas opciones sobre ellos que pueden marcar la diferencia. Tal como .cancelsTouchesInView = YES en mi caso.

Así que lo que hice, es utilizar un PanGestureRecognizer en la vista de menú, establecer .cancelsTouchesInView en YES, y funciona. Voy a evitar touchesBegan, ... como la peste, y escribir reconocedores de gestos personalizados para cualquier cosa compleja.

¡Espero que esto ayude a alguien a arrancarse el pelo como a mí!

Cuestiones relacionadas