2011-11-29 9 views
10

Estoy cargando una cadena HTML de longitud arbitraria en un UIWebView que luego se muestra en un UITableViewCell. No quiero que UIWebView se desplace independientemente del UITableView, así que debo redimensionar su altura para que se ajuste al contenido.Cambiar el tamaño de la altura UIWebView para que se ajuste al contenido

Este UITableViewCell también es colapsable, no muestra el UIWebView cuando está en estado colapsado.

El problema es, ¿cómo sé cuál es esta altura para que pueda tener heightForRowAtIndexPath devolver un valor adecuado y permitir que la mesa se vea y se desplace correctamente?

Aquí hay un código de ejemplo:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
if (indexPath.row == 0) 
    return 286; 

if (indexPath.row == 1) { 
    if (analysisExpanded) 
     return analysisWebViewHeight + 39; 
    else 
     return 52; 
} 

if (sourcesExpanded) 
    return sourcesWebViewHeight + 39; 

return 53; 

}

bastante simple. El 39 es la altura de algunas cosas de encabezado que tengo en la celda con la vista web.

Estoy cargando la "visión ampliada" de la célula a partir de una semilla, por lo que para obtener la vista web que estoy llamando viewForTag:

 UIWebView* sourcesWebView = (UIWebView*)[cell viewWithTag:1]; 
     [sourcesWebView setBackgroundColor:[UIColor clearColor]]; 
     [sourcesWebView loadHTMLString:placeholder baseURL:[NSURL URLWithString:@"http://example.com/"]]; 
     sourcesWebViewHeight = [[sourcesWebView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight"] floatValue]; 
     [sourcesWebView setFrame:CGRectMake(sourcesWebView.frame.origin.x, sourcesWebView.frame.origin.y, sourcesWebView.frame.size.width, sourcesWebViewHeight)]; 

sourcesWebViewHeight es una Ivar que se actualiza por el código anterior en cellForRowAtIndexPath . Si el usuario toca la celda tres veces, expandir-colapsar-expandir, y hace un poco de desplazamiento, eventualmente obtiene la altura correcta.

Intenté "precargar" la altura utilizando un objeto UIWebView de solo memoria, pero nunca devolvió los números correctos por algún motivo.

+0

Apple (en la documentación de UIWebView) dice estrictamente que no use UIWebView en UITableView. – makboney

+0

hemos publicado varias aplicaciones con vistas web como celdas sin ningún problema – Denis

+0

Más y mejores respuestas a la misma pregunta se pueden encontrar [aquí] [1] también. [1]: http://stackoverflow.com/questions/3936041/how-to-determine-the-content-size-of-a-uiwebview –

Respuesta

2

Para iOS Safari es necesario utilizar la siguiente línea:

NSInteger height = [[sourcesWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] integerValue]; 

document.documentElement.scrollHeight no funciona para este navegador.

sólo para estar seguro de que todo está bien, es necesario llamar a esto después de su vista-web ha terminado de cargar =)

ACTUALIZACIÓN: otra opción, que sólo funcionará para IOS5, que han añadido a la propiedad scrollView UIWebView, donde puede obtener contentSize.

5

El problema era que estaba intentando obtener el tamaño de espiral antes de que la vista web tuviera la oportunidad de representarlo.

Después de implementar el método delegado didFinishLoad, mi javascript original funcionó bien para obtener la altura.

+1

debe aceptar esto como la respuesta, trabajaban para ¿ – Fonix

1

Desde webViewDelegate puede obtener la altura de la web View cuando se carga el código HTML, el método tableview:heightForRowAtIndexPath: entrará en un bucle infinito de tratando de recuperar la web View se encuentra en la celda tableView:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    float height; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIWebView *webContent = (UIWebView *) [cell viewWithTag:tagTableSingleContentWeb]; 
    CGRect frame = webContent.frame; 

    height = frame.origin.y + frame.size.height + 30; 

    return height; 
} 

Lo anterior es el código intenté cambiar la celda tableView cuando inserto el código HTML en la celda webView dentro de la celda tableView, pero causará un ciclo infinito ....

Todavía estoy tratando de encontrar otra manera.

p.s.WebViewDelegate modo está bien cuando webView se encuentra en ScrollView, pero todavía no sé cómo hacer que funcione para la celda TableView.

+0

ha encontrado la solución? ¿Estoy teniendo el mismo problema? –

0

Más y mejores respuestas a casi la misma pregunta se pueden encontrar here también. Solo pensé que podría ser útil para alguien.

Cuestiones relacionadas