2010-04-20 20 views
11

Quiero establecer contenidos html simples dentro de una vista web y luego cambiar el tamaño de acuerdo con su contenido.¿Cómo cambiar el tamaño de WebView según su contenido?

Para establecer el contenido HTML simples dentro de vista web que he utilizado este código y que está trabajando muy bien:

[[myWebView mainFrame] loadHTMLString:webViewContents baseURL:baseURLFramed]; 

En este momento, si el contenido es más que su tamaño real, entonces aparece en vista web mostrando tanto vertical como desplazamiento horizontal en ella. Quiero establecer un ancho predeterminado y administrar la altura de acuerdo con su contenido de manera que no aparezca el desplazamiento horizontal ni vertical.

¿Alguien me puede sugerir alguna solución?

Gracias,

Miraaj

Respuesta

20

Puede registrarse como delegado de carga marco de la WebView 's, y cuando se carga la página se puede pedir a la vista el documento de la estructura principal por su tamaño y cambiar el tamaño de la WebView. Asegúrese de desactivar las barras de desplazamiento en el marco o tendrá problemas.

Tenga en cuenta que ciertas páginas pueden ser muy grandes, cuando probé daringfireball.net llegó a 17612 puntos de alto, lo que obviamente es demasiado grande para mostrar en la pantalla.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    //set ourselves as the frame load delegate so we know when the window loads 
    [webView setFrameLoadDelegate:self]; 

    //turn off scrollbars in the frame 
    [[[webView mainFrame] frameView] setAllowsScrolling:NO]; 

    //load the page 
    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://daringfireball.net"]]; 
    [[webView mainFrame] loadRequest:request]; 
} 

//called when the frame finishes loading 
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)webFrame 
{ 
    if([webFrame isEqual:[webView mainFrame]]) 
    { 
     //get the rect for the rendered frame 
     NSRect webFrameRect = [[[webFrame frameView] documentView] frame]; 
     //get the rect of the current webview 
     NSRect webViewRect = [webView frame]; 

     //calculate the new frame 
     NSRect newWebViewRect = NSMakeRect(webViewRect.origin.x, 
              webViewRect.origin.y - (NSHeight(webFrameRect) - NSHeight(webViewRect)), 
              NSWidth(webViewRect), 
              NSHeight(webFrameRect)); 
     //set the frame 
     [webView setFrame:newWebViewRect]; 

     //NSLog(@"The dimensions of the page are: %@",NSStringFromRect(webFrameRect)); 
    } 
} 
+0

Thanx Rob ... Lo he implementado y funciona bien ... pero hay un problema: siempre se establece la altura más alta para la vista web que obtengo para diferentes contenidos ... es decir. si la altura era 1029.0 y ahora debería ser 339.0, entonces se agrega espacio al final y muestra la vista web con altura 1029.0 – Miraaj

+3

Rob el problema ya está resuelto ... antes de configurar su contenido, ahora estoy cambiando el tamaño de la vista web a algunos valores predeterminados y más pequeños. .. decir, (15.0, 0.0, 560.0, 10.0) .. Debo decir Rob Rocks! – Miraaj

+0

Cuando cambio el DOM durante alguna interacción en el WebView que desencadena un cambio en las dimensiones del área visible del mismo, este método 'webView: didFinishLoadForFrame' no se volverá a llamar, ¿cierto? ¿Hay algún delegado que se llamará en este caso? Por cierto: tu solución no funcionó para mí. Tal vez puedas ayudar [aquí] (http://stackoverflow.com/q/21992854/1146700)? – beipawel

2

Otra alternativa es solicitar al DOM la altura de su contenido.

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 
{ 
    NSString* heightOutput = [sender stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").scrollHeight;"]; 
    NSInteger height   = [heightOutput integerValue]; 

    [[self splitView] setPosition:height + 10 ofDividerAtIndex:0]; 
} 

El punto clave aquí es colocar su contenido dentro de un elemento llamado así getElemenById se puede utilizar. Mi implementación usó un elemento simple <div id="foo">.

En mi caso particular, mi WebView estaba dentro de un NSSplitView, por lo que primero restablecer la altura del WebView a algo pequeño estaba causando un parpadeo.

Tengo un proyecto de muestra here demostrándolo.

+1

Esto funciona mejor para mí que '[[[frameframe frameView] documentView] frame]' porque siempre devuelve el valor correcto. No sé por qué, pero 'documentView.frame' solo funciona cuando una página se carga por primera vez; de lo contrario, devuelve el tamaño vacío (quizás debido al almacenamiento en caché). – Darrarski

+0

De hecho, @Darrarski: esto incluso funciona después de que el marco ha cambiado de tamaño, cambiando su ancho, provocando que también cambie la altura del contenido, mientras que la respuesta aceptada no ayuda en ese caso ya que sigue informando el tamaño inicial. –

Cuestiones relacionadas