Cómo determinar la altura UIWebView en función del contenido, dentro de una altura variable UITableView?

UITableView crear una UITableView con filas de altura variable como se explica en la respuesta a esta pregunta

Mi problema es que cada celda contiene un UIWebView con contenido diferente (cargado estáticamente). No puedo entender cómo calcular la altura adecuada según el contenido. ¿Hay alguna forma de hacer esto? He intentado cosas como esta:

  (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; [cell setNeedsLayout]; [cell layoutIfNeeded]; return cell.bounds.size.height; } 

Las celdas mismas se cargan desde un plumín, que es simplemente una UITableViewCell contiene un UIWebView . (También estaría bien si las celdas se ajustaran solo al contenido html más grande, aunque la altura variable sería más agradable).

Este código es probablemente demasiado lento para el uso de la vista de tabla, pero funciona. No parece que haya ninguna alternativa, ya que UIWebView no ofrece acceso directo al DOM.

En un viewDidLoad del controlador de vista viewDidLoad poco de HTML en una vista web y cuando la carga ha terminado ejecuto algunos javascript para devolver la altura del elemento.

 - (void)viewDidLoad { [super viewDidLoad]; webview.delegate = self; [webview loadHTMLString:@"
The quick brown fox jumped over the lazy dog.
" baseURL:nil]; } - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; NSLog(@"height: %@", output); }

Estaba muy contento de encontrar sus respuestas, el truco de JavaScript funcionó bien para mí.

Sin embargo, quería decir que también está el método “sizeThatFits:”:

 CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)]; 

Tenemos que establecer un tamaño preferido diferente de cero, pero aparte de eso, ¡siempre funciona!

Usualmente, porque con UIWebViews, parece funcionar solo en la segunda carga (yo uso el método “loadHTMLString:”, y sí, llamo “sizeThatFits:” desde el método delegado “didFinishLoad:”).

Por lo tanto, es por eso que estoy muy contento de encontrar su solución que funciona en cualquier caso.

Esto parece funcionar Por ahora.

 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight = 0.0f; if (self.subviews.count > 0) { UIView *scrollerView = [self.subviews objectAtIndex:0]; if (scrollerView.subviews.count > 0) { UIView *webDocView = scrollerView.subviews.lastObject; if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]]) webViewHeight = webDocView.frame.size.height; } } } 

Debería devolver 0 de manera segura si falla.

El problema con -sizeThatFits: es que no funciona de la caja, al menos no en iOS 4.1. Simplemente devuelve el tamaño actual de la vista web (sin importar si se llama con CGSizeZero o un tamaño arbitrario distinto de cero).

Descubrí que realmente funciona si reduces la altura del marco del webView antes de llamar a -sizeThatFits:

Ver mi solución: ¿cómo determinar el tamaño del contenido de un UIWebView?

Si tiene valores erróneos con sizeThatFits la primera vez pero no después, aquí hay una posible causa que he encontrado: un error con CSS externo. Parece que se llama a webViewDidFinisLoad pronto, antes de que se recuperen CSS externos, y que el documento web se haya creado completamente. Creo que el error desaparece si recargas debido a la caché.

Un truco: precarga tu CSS con UIWebView ficticio pronto en tu aplicación.

SDK: IOS4

medir una vista web funciona, pero solo cuando ha cargado su contenido

  • hacer que la vista web sea pequeña (como 5 px)
  • cárgalo y espera hasta el final
  • llamando a sizeToFit en él entonces
  • obteniendo el tamaño ENTONCES
  • recarga la tabla vista (devuelve la altura correcta para la celda)

publicidad:: D veo mi clase M42WebviewTableViewCell en github que tiene problemas con esto

El mejor enfoque es usar la propiedad scrollView.contentSize.height , como a continuación.

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSLog(@"%f",webView.scrollView.contentSize.height); }