2011-04-01 5 views
6

En mi aplicación, deseo desactivar la Copia/Pegado/Corte de contenidos que se muestra con un objeto UIWebView. Para lograr esto, he creado una subclase UIWebView y hizo caso omiso de la - (BOOL)canPerformAction:(SEL)action withSender:(id)sender método:UIWebView sin copiar/pegar y rectángulo de selección al mostrar documentos

#pragma mark - UIResponderStandardEditActions 

- (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]; 
} 

Ahora el ya no puede realizar este tipo de operaciones de usuario, sin embargo, el UIWebView sigue mostrando el "rectángulo de selección", como se puede ver en el siguiente captura de pantalla:

Selection rectangle

NOTA: el contenido que se mostró en el UIWebView no es páginas HTML. Estoy mostrando archivos de documentos (PDF, DOC, PPT), cargado de un archivo usando:

NSURL *fileURL = [NSURL fileURLWithPath:<document file path..>]; 
NSURLRequest *fileRequest = [NSURLRequest requestWithURL:fileURL]; 
[<uiwebView> loadRequest:fileRequest]; 

¿Hay alguna manera de desactivar/ocultar esta característica rectángulo de selección también?

[] s

,

+1

A menos que esté 100% seguro de que nadie más ofrece el mismo contenido (o similar), esta "función" solo sirve para alejar a las personas de su aplicación. –

+0

@Franci Penov: puedo pensar en muchos casos en los que un usuario no quisiera que apareciera el puntero de selección. De hecho, a menudo se tuerce con mi experiencia de usuario al leer algo y desplazarse lentamente (manteniendo el dedo hacia abajo, leyendo, arrastrando, termina seleccionando pero quería desplazarse). – Kalle

+0

@Franci: estoy 100% seguro de que nadie más proporcionará dicho contenido. La aplicación se está creando para mostrar contenido que está restringido a cierto público. Esta "característica" es un requisito del cliente (de lo contrario, ciertamente no me molestaría con eso). @Kalle: Estoy totalmente de acuerdo con tu opinión. –

Respuesta

14

Usted puede intentar inyectar JavaScript en la web View. Este código también funciona en el iPhone, pero solo cuando la página está completamente cargada. http://www.javascriptsource.com/page-details/disable-text-selection.html o http://solidlystated.com/scripting/proper-way-to-disable-text-selection-and-highlighting/

Para conseguir que funcione correctamente cuando la página se carga sólo la mitad o aún cargar podrás proably tener que utilizar una configuración similar a ésta donde se inyecta el javascript desactivando así como sería empezar a seleccionar . http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

Una última cosa que puedo pensar que podría funcionar, ¿ha probado añadiendo el selector @selector (seleccione :) a la lista de selectores desactivados?

EDITAR: Bien, como usted muestra un PDF en lugar de una página html puede intentarlo.

Configuración

Ponga la web View en un ScrollView;

Establezca ScrollView's: delegate en self; min zoom a 1.0 y zoom máximo a lo que quieras;

Después de que weView haya terminado de cargarse. Busque el primer UIScrollView en el webView, (estamos escaneando para que no se rompa en las versiones posteriores de iOS). Establezca el marco de UIWebViews en su tamaño de scrollViews. Y configure el contentSize de scrollView en webViews contentSize (o por ahora, es el marco).

-(void)setup{ 
    //Get the webView's first scrollView (the one all the content is in). 
    UIScrollView *webViewContentView; 
    for (UIView *checkView in [webView subviews]) { 
     if ([checkView isKindOfClass:[UIScrollView class]]) { 
      webViewContentView = (UIScrollView*)checkView; 
      break; 
     } 
    } 

    webView.frame = CGRectMake(0, 0, webViewContentView.contentSize.width, webViewContentView.contentSize.height); 
    scrollView.contentSize = webViewContentView.contentSize; 
    scrollView.delegate = self; 
} 

Para activar el zoom, deberá agregar un método adicional del delegado de scrollViews.

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return webView; 
} 

Y se puede descargar un proyecto de ejemplo http://www.multiupload.com/P8SOZ4NW6C (Es un proyecto Xcode 4).

NOTAS: El zoom pixelates el contenido de la web View si acerca a la web View mucho porque no sabe que volver a hacer las cosas, y de hacer que usted no puede hacer clic en los enlaces (pero en un PDF que no deben' ser un problema).

EDIT 2: Mejor método

Después de haber escrito esto he dado cuenta de un método mucho más simple y más fácil, que también debe resolver el problema de la pixelación.

-(void)removeInput{ 
    UIScrollView *webViewContentView; 
    for (UIView *checkView in [webView subviews]) { 
    if ([checkView isKindOfClass:[UIScrollView class]]) { 
     webViewContentView = (UIScrollView*)checkView; 
      break; 
     } 
    } 

    for (UIView *checkView in [webViewContentView subviews]) { 
     checkView.userInteractionEnabled = NO; 
    } 
} 

Ahora sólo debe ser capaz de interactuar con el propio UIScrollView, es decir, zoom, desplazamiento, etc .. debe seguir funcionando (y la página debe volver a hacer más bien la pixelación cuando uno se acerca), pero se puede' t seleccione cualquier texto, o escriba cualquier cosa en.

también algo acerca de este método es que en base a this list of UIWebView subViews que podría ser posible poner esto delante de la página empieza a cargar en lugar de después de que haya terminado de cargar la página.

+1

Agradezco su respuesta, esto parece funcionar al mostrar páginas HTML en UIWebView. Creo que no fui lo suficientemente claro en mi pregunta (la editaré). Los contenidos que se muestran en UIWebView son archivos PDF, DOC, PPT, XLS (solo hago una URLRequest para cargar desde un archivo). –

+0

Bueno, otro método que usted/podría/puede probar es obtener el tamaño de la vista de contenido el UIWebView tiene, estableciendo el tamaño de las vistas web a esa inhabilitación de la interacción del usuario en la vista web, y agregándola a un UIScrollView con su tamaño de contenido configurado para el tamaño de las vistas web, escribiré otra respuesta con más detalles si lo desea. –

+0

esto parece la solución para mi problema. Pude escribir eso, pero si pudiera, me gustaría ver su implementación y aceptarla como una respuesta. Gracias. –

Cuestiones relacionadas