2010-07-23 8 views
9

He estado buscando la semana pasada para la respuesta a esta pregunta.¿Cómo restablecer el zoom de UIWebView? Ya estoy usando scalesPagesToFit = YES;

Tengo un UIWebView, dentro de UIScrollView. Todo funciona muy bien, pero quiero que el contenido de UIWebView restablezca su zoom cuando cambia la orientación.

En el código HTML dentro de UIWebView, establezco el ancho de la ventana (con una metaetiqueta) en "ancho del dispositivo" y luego en el lado Obj-C, configuro scalesPagesToFit = YES;

He intentado restablecer el zoom con javascript; reemplazando las metaetiquetas en tiempo de ejecución; recargando acceder al UIScrollView dentro de UIWebView; etc ...

pero sin éxito.

¿Alguno de ustedes, dioses, conoce una solución?

El único que se me ocurre es recrear la UIWebViews cada vez que cambie la orientación, sino que los hace parpadear al blanco, mientras que el contenido de la representación, que se ve terrible :(

Alguna idea?

muchas gracias, Andre

+0

¿Quizás el truco está en la reconstrucción de las vistas web? Lo probé, pero parpadean en blanco, debido a ese momento en el que pierden su contenido, por lo que no se ve muy bien. ¿Alguna otra solución? – Andre

+0

rodado en la oscuridad, pero creo que la versión móvil del sitio wikipedia lo hace. Podrías echar un vistazo a su html/javascript. – Douglas

Respuesta

8

Sólo estoy adivinando aquí y no lo he probado, pero que yo sepa una UIWebView tiene un niño UIScrollView Así que uno debe ser capaz de hacer:.

for (UIScrollView *scroll in [myWebView subviews]) { 
    // Make sure it really is a scroll view and reset the zoom scale. 
    if ([scroll respondsToSelector:@selector(setZoomScale:)]) 
     [scroll setZoomScale:1.0]; 
} 
+0

¿Sabes si esto pasaría la aprobación de la App Store o es una API privada? Saludos, Andre – Andre

+1

Esto debería estar perfectamente bien. He visto un artículo que usa la misma técnica para desactivar el rebote de la vista cuando llega al final. Solo las API públicas se usan aquí, así que Apple no tiene nada por qué quejarse. Si Apple decide cambiar UIWebView para no usar un elemento secundario UIScrollView, este código no se bloqueará, simplemente no restablecerá el zoom más. – DarkDust

+1

Cool. Para que lo sepas, intenté este código antes y no funcionó. Descubrí que para que funcione (en mi caso) primero debe reemplazar las etiquetas meta en el HTML, cambiar la escala máxima de la ventana gráfica a 1.0 y luego llamar a setZoomScale. – Andre

1

Si desea hacerlo mediante programación esta es la única manera que pude encontrar para lograrlo: (especificar sus propios tamaños si lo desea, yo estaba tratando de alejar la imagen después de escribir en un campo de formulario)

UIScrollView *sv = [[webViewView subviews] objectAtIndex:0]; 
[sv zoomToRect:CGRectMake(0, 0, sv.contentSize.width, sv.contentSize.height) animated:YES]; 
1

actualización: downscaling no funcionaba correctamente cuando se utiliza

[[[webView subviews] lastObject] setZoomScale:0.25]; 

la calidad de las imágenes que se están downscaled en la página era horrible. Hacer:

[[[webView subviews] lastObject] setZoomScale:0.25 animated:YES]; 

Se lo arregló. Entonces esa última línea es la que podrías usar.

webView fue subclasificado de un UIWebView que se encuentra en un archivo IB. No usé la ventana gráfica en absoluto. Encuentro que uno debe elegir haciendo esto desde el lado de Cocoa Touch o usar JS.

utilicé:

webView.scalesPageToFit = YES; 

Me pregunto si hay una manera de restablecer el scalesPageToFit.

3

En iOS 5+ tiene acceso a scrollView. Just do:

[webView.scrollView setZoomScale: 1.0];

+0

funciona bien, gracias. esto es mucho más simple que el bucle for. pero como dijo @Andre en un comentario sobre la respuesta aceptada, primero debe reemplazar las metaetiquetas en el HTML para cambiar la escala máxima de la ventana gráfica a 1.0 –

0

La adaptación de la respuesta de Captnwalker1, se me ocurrió esto:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if(toInterfaceOrientation ==UIInterfaceOrientationPortrait||toInterfaceOrientation==UIInterfaceOrientationMaskPortraitUpsideDown) 
    { 
     currentScrollView = [[webView subviews] objectAtIndex:0]; 
     [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO]; 
    } 
    else 
    { 
     currentScrollView = [[webView subviews] objectAtIndex:0]; 
     [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO]; 
    } 
} 

Así cargar su imagen vistas web, y la imagen se restablecerá su tamaño cuando se gira.

Cuestiones relacionadas