example app ios uiwebview webkit ios4 mobile-webkit

app - wkwebview ios



Desactivar la selección del usuario en UIWebView (12)

Tengo una aplicación donde cargo contenido a un UIWebView y lo presento. No puedo deshabilitar por completo la interacción del usuario porque quiero que el usuario pueda hacer clic en los enlaces. Solo necesito deshabilitar la selección del usuario. Encontré en algún lugar de Internets que puedes usar:

document.body.style.webkitUserSelect=''none'';

Intenté insertar esto como

[self.contentView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect=''none'';"];

en webViewDidFinishLoad:

Sin embargo, no funciona. Todavía puedo seleccionar y copiar texto dentro de WebView.

¿Alguna idea de lo que podría estar yendo mal?

Actualización: Esto solo parece suceder a partir de iOS 4.3


¡Resultado del gran trabajo por una semana! Todas las demás respuestas son incorrectas si desea guardar los eventos del mouse y la entrada del usuario en muchas páginas.

1) Método Swizzle (por la biblioteca rentzsch/jrswizzle ):

[NSClassFromString(@"UIWebDocumentView") jr_swizzleMethod:@selector(canPerformAction:withSender:) withMethod:@selector(myCanPerformAction:withSender:) error:nil];

NSObject + myCanPerformAction.h:

@interface NSObject (myCanPerformAction) - (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender; @end

NSObject + myCanPerformAction.m:

#import "NSObject+myCanPerformAction.h" @implementation NSObject (myCanPerformAction) - (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(copy:)) { return [self myCanPerformAction:action withSender:sender]; } if (action == @selector(paste:)) { return [self myCanPerformAction:action withSender:sender]; } return NO; } @end

2) Coloque UIWebView en UIView y agregue un código:

UITapGestureRecognizer* singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease]; singleTap.numberOfTapsRequired = 2; singleTap.numberOfTouchesRequired = 1; singleTap.delegate = self; [self.view addGestureRecognizer:singleTap];

Y éste:

- (void)handleSingleTap:(UIGestureRecognizer*)gestureRecognizer { return; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *gesture = (UITapGestureRecognizer *)otherGestureRecognizer; if (gesture.numberOfTapsRequired == 2) { [otherGestureRecognizer.view removeGestureRecognizer:otherGestureRecognizer]; } } return YES; }


Aquí hay algunas maneras de deshabilitar la selección:

Agregue lo siguiente a sus documentos web móviles

<style type="text/css"> * { -webkit-touch-callout: none; -webkit-user-select: none; /* Disable selection/copy in UIWebView */ } </style>

Carga programáticamente el siguiente código Javascript:

NSString * jsCallBack = @"window.getSelection().removeAllRanges();"; [webView stringByEvaluatingJavaScriptFromString:jsCallBack];

Deshabilite el menú Copiar / Pegar usuario:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(copy:) || action == @selector(paste:)|| action == @selector(cut:)) { return _copyCutAndPasteEnabled; } return [super canPerformAction:action withSender:sender]; }


Estoy usando esta técnica en una aplicación web para Android / iPhone (empaquetada con Trigger.IO) y encontré que solo funcionaría con la sintaxis de encadenamiento para la pseudoclase: not (),:

*:not(input):not(textarea) { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ }


La primera solución dada funcionó perfectamente para mí ... hasta que cargué un .pdf en mi UIWebView.

La carga de un archivo .doc funcionó a la perfección, pero al cargar un .pdf resultó que la siguiente línea de código ya no tenía el efecto deseado y el menú Copiar / Definir apareció nuevamente en un toque largo por parte del usuario.

[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=''none'';"];

Después de otro ataque de pelo encontré esta respuesta aquí por Johnny Rockex y funcionó como un campeón. UIWebView sin copiar / pegar cuando se muestran archivos PDF

¡¡Muchas gracias a él por esta solución genial y fácil de implementar !!


La respuesta de TPoschel es corrent, pero en mi caso el orden fue importante.

// this works - locks selection and callout - (void)webViewDidFinishLoad:(UIWebView *)webView { [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=''none'';"]; [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout=''none'';"]; } // this doesn''t work - locks only callout - (void)webViewDidFinishLoad:(UIWebView *)webView { [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout=''none'';"]; [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=''none'';"]; }


Me gusta la solución WrightsCS, pero la utilizaré para que los usuarios puedan seguir utilizando las acciones copiar, pegar y seleccionar en las entradas

<style type="text/css"> *:not(input,textarea) { -webkit-touch-callout: none; -webkit-user-select: none; /* Disable selection/Copy of UIWebView */ } </style>


No estoy seguro de cómo se realiza la instalación, pero ¿por qué no acaba de borrar el pasteboard cuando se llama a viewWillDisappear? Tal vez algo así como en su aplicaciónDelegate.m:

[UIPasteboard generalPasteboard].string = nil;

esto asegurará que sea cual sea el usuario de datos que haya copiado, no podrá pegarlo fuera de la aplicación.

Además, al igual que Engin, puede anular el método canPerformSelector en la clase de controlador que contiene uiwebview.


Para mí, tuve la intención de buscar los NSData de imágenes de UIWebView por LongPressGesture .

Pero el Ampliador y Copiar / Pegar / Cortar siempre ocurren antes de que mi func se ejecute.

Y encontré esto:

Significa que el Lupa y Copiar / Pegar / Cortar necesitan 0.5 segundos para ejecutarse, así que si tu func se puede ejecutar en 0.49s, ¡HECHO!

self.longPressPan.minimumPressDuration = 0.3


Puedo confirmar que el siguiente código funciona en iOS 5.0 - 8.0.

- (void)webViewDidFinishLoad:(UIWebView *)webView { // Disable user selection [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=''none'';"]; // Disable callout [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout=''none'';"]; }

También funciona para iOS 9. Aquí está el código rápido:

func webViewDidFinishLoad(webView: UIWebView) { // Disable user selection webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect=''none''")! // Disable callout webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout=''none''")! }


Use la función de interacción de vista web

webView.userInteractionEnabled = false

Esto funciona para mi

PD: recuerde habilitar la interacción cuando desee que el usuario pueda interactuar de nuevo con la vista web


Puedo confirmar que esto definitivamente funcionará para ti.

<style type="text/css"> *:not(input):not(textarea) { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ } </style>

Si desea deshabilitar solo la etiqueta del botón de anclaje, utilice esto.

a {-webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ }


let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: nil, action: nil) longPress.minimumPressDuration = 0.2 webView.addGestureRecognizer(longPress)

Simplemente agregue este código a su viewDidLoad (). El usuario puede hacer clic en el enlace pero no puede copiar el contenido.