UIWebView no carga por completo, la altura varía

Tengo un controller de vista que contiene algunas tags y una UIWebView que está cargando un poco de html. Todas estas tags y UIWebView son subviews de un UIScrollView. He deshabilitado el desplazamiento de UIWebView para que las tags y UIWebView se desplacen todos juntos dentro de UIScrollView.

Luego descubrí el tamaño del contenido dentro de UiWebView, cambié el tamaño de UIWebView según el tamaño de contenido y luego establecí el tamaño de la vista de desplazamiento al tamaño de la vista web. Así es como lo hice agregando el siguiente código en webViewDidFinishLoad:

CGRect frame = myWebView.frame; frame.size.height = 1; myWebView.frame = frame; CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; myWebView.frame = frame; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); mainScrollView.contentSize = myWebView.bounds.size; 

Como estoy usando NSLog para ver el tamaño del contenido de la vista web, noté que da una altura diferente para el mismo contenido. Por ejemplo, si abro el controller de vista la primera vez, muestra la altura igual a 915.0 y cuando retrocedo en la navigation y regrese a este controller de vista, el logging mostrará el tamaño a 1012.0.

Creo que podría deberse a que las imágenes se cargan en el contenido html. ¿Alguien puede decir cómo puedo arreglarlo para mostrar la altura correcta la primera vez? ¡Gracias!

ACTUALIZACIÓN: Si utilizo una estrategia diferente usando javascript, ya he intentado usar el siguiente código:

 CGRect oldBounds = [[self myWebView] bounds]; CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; NSLog(@"NEW HEIGHT %f", height); [myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; mainScrollView.contentSize = myWebView.bounds.size; 

Este código me da la altura correcta cada vez en el logging, que es exactamente lo que quiero, pero toda la vista web se desplaza un poco hacia arriba bloqueando todas las tags que están encima. ¿Estoy haciendo algo mal y cómo solucionarlo? ¡Gracias!

Este es un problema muy común cuando intenta incrustar UIWebView y otras vistas dentro de UIScrollView.

SOLUCIÓN 1: Ya has explicado la primera solución en tu pregunta. Sin embargo, esta solución solo es válida cuando solo hay text involucrado en UIWebView dentro de UIScrollView. Si hay imágenes y ajax o cualquier cosa que cargue perezosamente, esta solución no le dará la altura correcta la primera vez.

 CGRect frame = myWebView.frame; frame.size.height = 1; myWebView.frame = frame; CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; myWebView.frame = frame; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); mainScrollView.contentSize = myWebView.bounds.size; 

SOLUCIÓN 2: La otra solución está utilizando javascript. Te da la altura correcta cada vez, pero te enfrentarás a problemas extraños que no puedo solucionar. En tu caso, dijiste que toda la vista se ha cambiado un poco.

 CGRect oldBounds = [[self myWebView] bounds]; CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; NSLog(@"NEW HEIGHT %f", height); [myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; mainScrollView.contentSize = myWebView.bounds.size; 

SOLUCIÓN 3: La última solución es la que funcionó para mí y definitivamente solucionará su problema. Implica combinar el código en las dos primeras soluciones que describí. Es decir, obtendrá la altura usando javascript ya que le da la altura correcta cada vez y luego usa el rest del código en la primera solución e incrementa algunos puntos. Tenga en count que agregué +125.0, así es como lo resolví:

 CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; CGFloat width = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue]; CGRect frame = myWebView.frame; frame.size.height = height + 125.0; frame.size.width = width; myWebView.frame = frame; mainScrollView.contentSize = myWebView.bounds.size; 

¡Espero que esto ayude!

WebView carga todo su contenido de forma asíncrona.

tienes que esperar a webViewDidFinishLoading para que el html esté cargado (¡no los datos de la image todavía!) Entonces conoce el tamaño del html. Allí, sizeToFit debería funcionar.

Como UIWebView se carga en segundo plano, tendrás que esperar hasta que cargue tu página, luego descifrar la altura.

Hay un método aquí: https://stackoverflow.com/a/3937599/210171 .

Sin embargo, suelo usar la técnica javascript. En su delegado de vista web, cambie su -webViewDidFinishLoad: para que se vea así:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString * heightString = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; CGFloat contentHeight = [ heightString doubleValue ] ; NSLog( @"contentHeight=%f\n", contentHeight ) ; } 

(Este código se toma de https://stackoverflow.com/a/751326/210171 )

La altura del contenido puede continuar cambiando a medida que las imágenes se cargan si sus imágenes no tienen su atributo size set. En ese caso, consulte mi respuesta aquí: https://stackoverflow.com/a/12030878/210171