Hacer zoom en UIWebView

Tengo una UIWebView que UIWebView para mostrar una variedad de contenido, a veces HTML y, a veces, PDF / Powerpoint / etc (que es todo lo que aparentemente maneja el mismo control subyacente).

Lo que quiero hacer es aprovechar la UIScrollView subyacente (una subvista de la UIWebView ) para capturar la perspectiva exacta de la vista de desplazamiento y volver a crear la position de desplazamiento en otra UIWebView , manteniéndolos sincronizados.

El problema que estoy teniendo es que la propiedad zoomScale de UIScrollView es siempre 1.0 mientras muestra contenido HTML (aunque al mostrar el contenido de PDF, zoomScale es correcto).

scrollViewDidEndZooming:withView:atScale: encontrar que el único lugar donde puedo tener alguna idea de la escala de zoom de una página HTML está en el scrollViewDidEndZooming:withView:atScale: delegate. Descubrí que el argumento atScale: parece proporcionar una escala de zoom relativa , a la escala de zoom antes de que comenzara la operación de zoom. Así, por ejemplo, al acercar el zoom, ese argumento es> 1, y al networkingucirlo es <1, y parece ser un valor relativo entre las dos escalas de zoom en lugar de una escala de zoom absoluta).

Lo que he encontrado es que, fundamentalmente, el contenido HTML y PDF se maneja con dos vistas subyacentes diferentes: hay UIWebBrowserView que maneja el contenido HTML y UIWebPDFView para manejar la visualización de files PDF.

En otras palabras, cuando se usa una UIWebPDFView , la propiedad zoomScale de UIScrollView es completamente confiable (p. Ej., 1.0 para zoomed-out, 2.4 para zoomed-in, por ejemplo). Por otro lado, UIWebBrowserView es mucho más complicado, y al preguntar a UIScrollView por su zoomScale , siempre devuelve 1.0 , pero cuando recibe la callback de delegado, recibe un valor de escala que es un valor relativo.

Entonces, mis preguntas son:

  1. ¿Es esto un error? (Este comportamiento se ve en iOS 4 y 5 de lo que he visto).

  2. ¿Cómo puedo get tanto zoomScale (o alguna otra propiedad / properties) para contenido HTML y PDF, y getlo de tal manera que el estado se pueda duplicar y mantener sincronizado con otra UIWebView .

No estoy obligado a usar zoomScale , así que estoy abierto a otras sugerencias sobre cómo se puede capturar y reproducir el estado de desplazamiento de un UIWebView en otra UIWebView .

Al cargar HTML, y UIWebBrowserView se está utilizando, puede usar

zoomScale = 1.0 / webView.scrollView.minimumZoomScale

Por supuesto, esto supone que puede asegurarse de forma fiable que el zoom mínimo de su página HTML sea 1.0, ya que algunas páginas pueden alterar el zoom mínimo utilizando la metalabel "viewport".

¿Has probado esto?

 set scalesPageToFit=YES; 

Esa es la forma más común de lidiar con el problema, creo. Configuración que le permite pellizcar y hacer zoom en UIWebView. No creo que realmente pueda acercar / alejar UIWebView sin eso.

Ahora el zoom va a ser relativo a lo que estés mostrando en tu UIWebView. Si es una gran table, no está tan cerca, pero es un buen punto de partida si quieres pellizcar para acercar.

Esta lógica para hacer zoom de UIWebView, no es necesario agregar UIWebView en UIScrollView

Bueno, solo problema con webView.scalesPageToFit=YES; Es, cambia el tamaño inicial de la fuente de contenido, pero tengo otra opción por mi count, está funcionando muy bien para mí.

Agregue <UIWebViewDelegate, UIScrollViewDelegate> a su file .h

Creación de su UIWebView.

 self.mWebview = [[UIWebView alloc] init]; self.mWebview.delegate = self; /// set delegate method of UIWebView self.mWebview.frame = CGRectMake(0, 35, self.view.bounds.size.width, self.view.bounds.size.height - 80); // set frame whatever you want.. [self.mWebview setOpaque:NO]; self.mWebview.backgroundColor = [UIColor clearColor]; [self.view addSubview:self.mWebview]; 

Con carga de files / contenido HTML.

 NSString* htmlString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"File Name"ofType:@"html"] encoding:NSUTF8StringEncoding error:nil]; [self.mWebview loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; #pragma mark - #pragma mark - Webview Delegate Methods - (void) webViewDidFinishLoad:(UIWebView *)webView { webView.scrollView.delegate = self; // set delegate method of UISrollView webView.scrollView.maximumZoomScale = 20; // set as you want. webView.scrollView.minimumZoomScale = 1; // set as you want. //// Below two line is for iOS 6, If your app only supported iOS 7 then no need to write this. webView.scrollView.zoomScale = 2; webView.scrollView.zoomScale = 1; } #pragma mark - #pragma mark - UIScrollView Delegate Methods - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { self.mWebview.scrollView.maximumZoomScale = 20; // set similar to previous. } 

NOTA: Tuve que probarlo en Mac OS X – 10.9.3 con Xcode 5.1.1 y iOS versión 6.1 y último.

Espero que esto te sea útil. 🙂

Desafortunadamente, la única manera que encontré para get la escala real del contenido web en un UIWebView es accediendo a un miembro privado de UIWebBrowserView: initialScale.

 float initialScale = (access to [UIWebBrowserView initialScale]) float zoomScale = 1.0 / webView.scrollView.minimumZoomScale; float actualScale = zoomScale * initialScale; 

Me pregunto si esto se puede hacer sin tener acceso a un miembro privado.

Esto puede ser un poco tarde, pero para aquellos que necesitan determinar si el UIWebView actual contiene HTML. Un método que escribí para determinar esto fue a continuación. Llamé a esto inmediatamente después de que el webView se haya cargado

 - (void)webViewDidFinishLoad:(UIWebView *)webView { if (!webViewIsHTMLHasBeenSet) { webViewIsHTML = [self containsWebBrowserView]; NSLog(@"webViewIsHTML = %@",webViewIsHTML ? @"YES": @"NO"); } } - (BOOL)containsWebBrowserView { BOOL result = NO; for (UIView * WVSubview in [webView.scrollView subviews]) { if ([NSStringFromClass([WVSubview class]) isEqualToString:@"UIWebBrowserView"]) { result = YES; webViewIsHTMLHasBeenSet = YES; return result; } } webViewIsHTMLHasBeenSet = YES; return result; } 

simplemente simplemente configurado,

scalesPageToFit=YES para pich zoom en una UIWebView