2012-05-17 14 views
12

En UITextview cuando se presiona el botón táctil durante más tiempo aparece la lupa. ¿Cómo puedo desactivarlo?Desactivar lupa en UITextview

+0

Mira este [hilo] (http://stackoverflow.com/questions/866200/disable-magnifying-glass-in-uitextfield) – Alexander

+0

La respuesta es [AQUÍ] (https://stackoverflow.com/a/ 48077605/4061501). ** No se necesita subclase. ** –

Respuesta

29

Por último, este problema también se resuelve

Aquí está el código de referencia en caso de que alguien necesita

en el archivo m de UITextView subclase código

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    //Prevent zooming but not panning 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
    { 
     gestureRecognizer.enabled = NO; 
    } 
    [super addGestureRecognizer:gestureRecognizer]; 
    return; 
} 

Funciona añade.

+2

Pero si no me equivoco, esto desactiva la pulsación larga totalmente. En otras palabras, si su vista de texto contiene un enlace URL o un número de teléfono (en caso de que haya habilitado las detecciones), al presionar prolongadamente su vista de texto no podrá responder a ellas, ¿estoy en lo cierto? – antf

+0

¿Desea también desactivar el cuidado y la edición de texto? Ver esta respuesta-> [enlace] (http://stackoverflow.com/questions/18139234/prevent-editing-of-text-in-uitextfield-and-hide-cursor-caret-magnifying-glass-wh/18139235#18139235) – thedeveloper3124

+1

Sí, como dijo @antf, este código desactiva totalmente los toques en los enlaces, teléfonos y eventos. – sig

2

Esto funciona para mí

@implementation CustomTextView 

- (NSArray *)selectionRectsForRange:(UITextRange *)range 
{ 
    self.selectedTextRange = nil; 
    return nil; 
} 

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    gestureRecognizer.delegate = self; 

    [super addGestureRecognizer:gestureRecognizer]; 
    return; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    return NO; 
} 

- (CGRect)caretRectForPosition:(UITextPosition *)position 
{ 
    return [super caretRectForPosition:self.endOfDocument]; 
} 


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if (([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && !gestureRecognizer.delaysTouchesEnded)) 
    { 
     return NO; 
    } 
    else 
     return YES; 

} 
0

@ respuesta de Irina funciona parcialmente (Pruebe con un toque seguido de una pulsación larga y tendrá una superposición de aumento) para iOS 9.x y se estrella en IOS 10 con la siguiente :

*** terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: 'no se puede cambiar el delegado de la relación UIViewControllerPreviewing fracaso gesto reconocedor'

El siguiente código funciona tanto para iOS 9.xy 10.x en cada combinación de toque y/o gestos largos que se me ocurra.

Nota No garantizo que será aceptado por la revisión de Apple.

@implementation CustomTextView 

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    NSArray *allowedGestures = @[ @"UILongPressGestureRecognizer", @"UIScrollViewDelayedTouchesBeganGestureRecognizer", @"UIScrollViewPanGestureRecognizer" ]; 

    if (![allowedGestures containsObject:NSStringFromClass([gestureRecognizer class])]) 
    { 
     return; 
    } 

    if (([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && !gestureRecognizer.delaysTouchesEnded)) 
    { 
     return; 
    } 

    [super addGestureRecognizer:gestureRecognizer]; 
} 

@end 

Necesitamos UIScrollViewDelayedTouchesBeganGestureRecognizer y UIScrollViewPanGestureRecognizer el fin de mantener la capacidad UITextView para desplazarse. Ambas clases son parte de la API privada así que úsalas bajo tu propio riesgo.