quitar por personalizar flotante control como centro boton barra assistive aparece abajo iphone uitextview

por - (iPhone) ¿Cómo manejar toques en un UITextView?



no me aparece el centro de control iphone (7)

¿Qué tal hacer un UIScrollView y [scrollView addSubview: textview] que hace posible desplazar la vista de texto?

Estoy tratando de manejar toques en el UITextView de un iPhone. Logré manejar los toques y otros eventos táctiles al crear una subclase de UIImageViews por ejemplo e implementar el método touchesBegan ... sin embargo, eso no funciona con la UITextView aparentemente :(

El UITextView tiene la interacción del usuario y el multitáctil habilitados, solo para estar seguros ... no, no hay alegría. ¿Alguien logró manejar esto?


Debe asignar la instancia de UITextView.delegate = self (asumiendo que desea encargarse de los eventos en el mismo controlador)

Y asegúrese de implementar el protocolo UITextViewDelegate en la interfaz ... ej:

@interface myController : UIViewController <UITextViewDelegate>{ }

Entonces puedes implementar cualquiera de los siguientes

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView; - (BOOL)textViewShouldEndEditing:(UITextView *)textView; - (void)textViewDidBeginEditing:(UITextView *)textView; - (void)textViewDidEndEditing:(UITextView *)textView; - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; - (void)textViewDidChange:(UITextView *)textView; - (void)textViewDidChangeSelection:(UITextView *)textView;


Estoy usando una vista de texto como una subvista de una vista más grande. Necesito que el usuario pueda desplazar la vista de texto, pero no editarla. Quiero detectar un solo toque en la vista de supervisión de la vista de texto, incluida la vista de texto en sí.

Por supuesto, me encontré con el problema de que la vista de texto se traga los toques que comienzan en ella. Deshabilitar la interacción del usuario solucionaría esto, pero el usuario no podrá desplazar la vista de texto.

Mi solución fue hacer que la vista de texto sea editable y usar el método delegado shouldBeginEditing de la vista de texto para detectar un toque en la vista de texto. Simplemente devuelvo NO, lo que impide la edición, pero ahora sé que la vista de texto (y, por lo tanto, la vista de supervisión) se ha activado. Entre este método y el método de toques de SuperviewEnded tengo lo que necesito.

Sé que esto no funcionará para las personas que desean tener acceso a los toques reales, pero si todo lo que quiere hacer es detectar un toque, ¡este enfoque funciona!


Si desea manejar el toque simple / doble / triple en UITextView, puede delegar UIGestureRecongnizer y agregar reconocedores de gestos en su vista de texto.

Aquí está el mismo código (en viewDidLoad):

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)]; //modify this number to recognizer number of tap [singleTap setNumberOfTapsRequired:1]; [self.textView addGestureRecognizer:singleTap]; [singleTap release];

y

-(void)handleSingleTap{ //handle tap in here NSLog(@"Single tap on view"); }

Espero esta ayuda: D


También puedes enviar un evento de Touch Down . Conecta este evento a través del Interface Builder.

Luego agregue el código en su controlador de eventos

- (IBAction)onAppIDTap:(id)sender { //Your code }


UITextView (subclase de UIScrollView) incluye una gran cantidad de procesamiento de eventos. Se encarga de copiar y pegar y detectores de datos. Dicho esto, es probable que sea un error que no transmita eventos no controlados.

Hay una solución simple: puede subclasificar UITextView e mejorar sus propios toques. Agregados (y otros mensajes de manejo de eventos) en sus propias versiones, debe llamar [super touchesBegan:touches withEvent:event]; Dentro de cada método de manejo táctil.

#import "MyTextView.h" //MyTextView:UITextView @implementation MyTextView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"touchesBegan"); } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesBegan:touches withEvent:event]; NSLog(@"touchesMoved"); } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"****touchesEnded"); [self.nextResponder touchesEnded: touches withEvent:event]; NSLog(@"****touchesEnded"); [super touchesEnded:touches withEvent:event]; NSLog(@"****touchesEnded"); } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ [super touches... etc]; NSLog(@"touchesCancelled"); }


Mejor solución (sin cambiar nada ni usar ninguna API privada: D)

Como se explica a continuación, la adición de nuevos UITapGestureRecognizers a la vista de texto no tiene los resultados esperados, los métodos de control nunca se llaman. Esto se debe a que el UITextView tiene una configuración de reconocedor de gestos de UITextView y creo que su delegado no permite que mi reconocedor de gestos funcione correctamente y cambiar su delegado podría llevar a resultados aún peores, creo.

Afortunadamente, el UITextView tiene el reconocedor de gestos que ya quiero configurar, el problema es que cambia según el estado de la vista (es decir, el conjunto de reconocedores de gestos es diferente cuando se ingresa en japonés que cuando se ingresa en inglés y también cuando no se está en modo de edición) . Resolví esto al reemplazar estos en una subclase de UITextView:

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { [super addGestureRecognizer:gestureRecognizer]; // Check the new gesture recognizer is the same kind as the one we want to implement // Note: // This works because `UITextTapRecognizer` is a subclass of `UITapGestureRecognizer` // and the text view has some `UITextTapRecognizer` added :) if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequired] == 1 && [tgr numberOfTouchesRequired] == 1) { // If found then add self to its targets/actions [tgr addTarget:self action:@selector(_handleOneFingerTap:)]; } } } - (void)removeGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { // Check the new gesture recognizer is the same kind as the one we want to implement // Read above note if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequired] == 1 && [tgr numberOfTouchesRequired] == 1) { // If found then remove self from its targets/actions [tgr removeTarget:self action:@selector(_handleOneFingerTap:)]; } } [super removeGestureRecognizer:gestureRecognizer]; } - (void)_handleOneFingerTap:(UITapGestureRecognizer *)tgr { NSDictionary *userInfo = [NSDictionary dictionaryWithObject:tgr forKey:@"UITapGestureRecognizer"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"TextViewOneFingerTapNotification" object:self userInfo:userInfo]; // Or I could have handled the action here directly ... }

Al hacerlo de esta manera, no importa cuando la vista de texto cambie sus reconocedores de gestos, siempre capturaremos el reconocedor de gestos de gestos que queremos. Por lo tanto, nuestro método de controlador será llamado en consecuencia :)

Conclusión: si desea agregar reconocedores de gestos al UITextView , debe verificar que la vista de texto no lo tenga ya.

  • Si no lo tiene, solo hazlo de forma regular. (Cree su reconocedor de gestos, configúrelo y agréguelo a la vista de texto) ¡y listo!
  • Si lo tiene, entonces es probable que necesites hacer algo similar al anterior.



Respuesta antigua

Se me ocurrió esta respuesta con un método privado porque las respuestas anteriores tienen contras y no funcionan como se esperaba. Aquí, en lugar de modificar el comportamiento de tapping del UITextView , simplemente intercepto el método llamado y luego el método original.

Explicación adicional

UITextView tiene un grupo de UIGestureRecognizers especializados, cada uno de ellos tiene un target y una action pero su target no es el UITextView sí, es un objeto de la clase directa UITextInteractionAssistant . (Este asistente es un @package ivar de UITextView pero su definición de avance está en el encabezado público: UITextField.h).

UITextTapRecognizer reconoce los UITextTapRecognizer y llama oneFingerTap: en el UITextInteractionAssistant por lo que queremos interceptar esa llamada :)

#import <objc/runtime.h> // Prototype and declaration of method that is going be swizzled // When called: self and sender are supposed to be UITextInteractionAssistant and UITextTapRecognizer objects respectively void proxy_oneFingerTap(id self, SEL _cmd, id sender); void proxy_oneFingerTap(id self, SEL _cmd, id sender){ [[NSNotificationCenter defaultCenter] postNotificationName:@"TextViewOneFinderTap" object:self userInfo:nil]; if ([self respondsToSelector:@selector(proxy_oneFingerTap:)]) { [self performSelector:@selector(proxy_oneFingerTap:) withObject:sender]; } } ... // subclass of UITextView // Add above method and swizzle it with. - (void)doTrickForCatchingTaps { Class class = [UITextInteractionAssistant class]; // or below line to avoid ugly warnings //Class class = NSClassFromString(@"UITextInteractionAssistant"); SEL new_selector = @selector(proxy_oneFingerTap:); SEL orig_selector = @selector(oneFingerTap:); // Add method dynamically because UITextInteractionAssistant is a private class BOOL success = class_addMethod(class, new_selector, (IMP)proxy_oneFingerTap, "v@:@"); if (success) { Method originalMethod = class_getInstanceMethod(class, orig_selector); Method newMethod = class_getInstanceMethod(class, new_selector); if ((originalMethod != nil) && (newMethod != nil)){ method_exchangeImplementations(originalMethod, newMethod); // Method swizzle } } } //... And in the UIViewController, let''s say [textView doTrickForCatchingTaps]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewWasTapped:) name:@"TextViewOneFinderTap" object:nil]; - (void)textViewWasTapped:(NSNotification *)noti{ NSLog(@"%@", NSStringFromSelector:@selector(_cmd)); }