ios objective-c uiwebview uiscrollview

ios - UIWebView no se carga por completo, la altura varía



webview ios (3)

Tengo un controlador de vista que contiene algunas etiquetas y un UIWebView que está cargando algunos html en él. Todas estas etiquetas y UIWebView son subvistas de un UIScrollView. Inhabilité el desplazamiento de UIWebView para que las etiquetas y UIWebView se desplacen juntas dentro de UIScrollView.

Luego, tomé el tamaño del contenido dentro de UiWebView, cambié el tamaño de UIWebView de acuerdo con el tamaño del contenido y luego establecí el tamaño de la vista de desplazamiento en el 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 controlador de vista la primera vez, muestra la altura igual a 915.0 y cuando retrocedo en la navegación y vuelvo a este controlador de vista, el registro mostrará que el tamaño será 1012.0.

Creo que puede deberse a la carga de imágenes 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 en todo momento en el registro que es exactamente lo que quiero, pero toda la vista web se desplaza un poco hacia arriba bloqueando todas las etiquetas encima de ella. ¿Estoy haciendo algo mal y cómo solucionarlo? ¡Gracias!


WebView carga todo su contenido de forma asincrónica.

tienes que esperar a webViewDidFinishLoading para que se webViewDidFinishLoading el html (¡no los datos de imagen todavía!) Luego conoce el tamaño del html. There sizeToFit debería funcionar.


Este es un problema muy común cuando intenta insertar un 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 texto involucrado en UIWebView dentro de UIScrollView. Si hay imágenes y ajax o algo así que se carga de forma perezosa, 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 es usar javascript. Te da la altura correcta en todo momento pero te enfrentarás a problemas extraños que no puedo solucionar. En tu caso, dijiste que toda la vista se desplazó un poco hacia arriba.

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 resolverá su problema. Implica unir el código en las primeras dos soluciones que describí. Es decir que obtendrá la altura con javascript ya que le da la altura correcta cada vez y luego usa el resto del código en la primera solución e incrementa algunos puntos. Observe 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!


Como UIWebView se carga en segundo plano, tendrá que esperar hasta que cargue su página y luego calcular la altura.

Un método está aquí: https://.com/a/3937599/210171 .

Sin embargo, generalmente uso la técnica de 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 está tomado de https://.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 de tamaño establecido. En ese caso, vea mi respuesta aquí: https://.com/a/12030878/210171