Cómo agregar gesto de doble toque a UITextView

actualmente quiero que UITextView tenga un gesto de doble toque. Parece que UITableView tiene su propio gesto de doble toque, cuando tocamos dos veces, se seleccionará algo de text. Por lo tanto, quiero eliminar este gesto pnetworkingeterminado de doble toque a mi propio reconocedor de gestos. Probé muchos methods y todos fallaron. Parece que no hay forma de eliminar el reconocedor pnetworkingeterminado de UITextView. También quiero agregar una vista transparente en este UITextView para hacer un evento de doble toque, pero esta subvista bloqueará otros gestos en UITextView. ¿Hay algún método para agregar el reconocedor de gestos de doble toque a UITextView? Realmente espero que haya un trabajo alnetworkingedor.

Todavía estoy esperando un trabajo alnetworkingedor de iOS5 🙂

Hay una serie de otros reconocedores de gestos adjuntos a una vista de text. Ya que parece que no los necesitas. Puede quitarlos.

myTextView.gestureRecognizers = nil; 

antes de agregar su reconocedor de doble toque. Funciona.

entonces puedes agregar

 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mySelector)]; tapRecognizer.numberOfTapsRequinetworking = 2; tapRecognizer.numberOfTouchesRequinetworking = 1; [myTextView addGestureRecognizer:tapRecognizer]; 

Tengo la solución en iOS6, podemos usar UIGestureRecognizerDelegate y anular gestureRecognizerShouldBegin: y gestureRecognizer: shouldReceiveTouch :. En este dos método, podemos verificar si el gesto es doubleTapGestureForZooming, si no devuelve NO, o devuelve YES. Esto funciona perfecto en iOS6, pero en iOS5 no se ha llamado a estos dos methods delegates, por lo que iOS5 puede necesitar otra solución. Finalmente, obtengo la solución, podemos anular el método addGestureRecognizer de UITextView para eliminar el gesto pnetworkingeterminado, ojalá esto ayude a alguien más.

PD: realmente no podemos eliminar los gestos del sistema de UITextView, incluso no podemos cambiar su propiedad. Parece que cuando ocurre un evento, todos los gestos de UItextview se agregarán nuevamente.

Sé que esta pregunta es antigua, pero para mantenerla actualizada para los futuros buscadores, pensé que agregaría otra solución que me funcionó desde iOS 7 hasta 10. Básicamente reúne las soluciones aquí y aquí, pero las retoca para get el UITextView para reconocer el doble toque personalizado.

Lo hace UITextView y anulando el método addGestureRecognizer: para inyectar nuestra callback personalizada en el gesto de doble toque y configurar el gesto de una sola pulsación para respetar el nuevo gancho de doble toque.

Lo hago en addGestureRecognizer: porque un UITextView constantemente borra y agrega gestos dependiendo de su estado actual, por lo que constantemente tiene que reiniciarlo.

Este código debería ser suficiente para que alguien comience:

 @interface MyCustomTextView () /** * we want to keep track of the current single-tap gesture so we can make sure * it waits for a double-tap gesture to fail before firing */ @property (weak, nonatomic) UITapGestureRecognizer *singleTap; /** * we want to keep track of the current double-tap gesture so we can tell a single * tap gesture to ignore this double-tap when the single tap gesture changes */ @property (weak, nonatomic) UITapGestureRecognizer *doubleTap; @end @implementation MyCustomTextView /** * this will fire when the text view is double-tapped * * @param tgr */ - (void)_handleTwoTaps:(UITapGestureRecognizer *)tgr { // ADD CODE HERE } /** * the reason why I've overridden this methods is these gestures change quite a bit * depending on the state of the UITextView, (eg, when in focus and out of focus) * and so this provides a reliable way to make sure any new gestures get updated * with custom overrides. * * @param gestureRecognizer */ - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { [super addGestureRecognizer:gestureRecognizer]; if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequinetworking] == 1 && [tgr numberOfTouchesRequinetworking] == 1) { self.singleTap = tgr; if (self.doubleTap) { [tgr requireGestureRecognizerToFail:self.doubleTap]; } } else if ([tgr numberOfTapsRequinetworking] == 2 && [tgr numberOfTouchesRequinetworking] == 1) { [tgr addTarget:self action:@selector(_handleTwoTaps:)]; self.doubleTap = tgr; if (self.singleTap) { [self.singleTap requireGestureRecognizerToFail:tgr]; } } } } // NOTE: I'm not sure if this is needed but it's been there for years // and so I thought I would include it just in case - (void)removeGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequinetworking] == 2 && [tgr numberOfTouchesRequinetworking] == 1) { [tgr removeTarget:self action:@selector(_handleTwoTaps:)]; } } [super removeGestureRecognizer:gestureRecognizer]; } @end