¿Cómo cambio la altura de una celda de tabla que ya se ha cargado?

Actualmente tengo visiones web cargando en celdas personalizadas de uitableview. El problema es que las vistas web tienen tamaños variables. En webViewDidFinishLoad, puedo configurar el tamaño de la vista web en function del tamaño real del documento html. Mi problema son las celdas de la tabla que ya han tenido su altura establecida en heightForRowAtIndexPath antes de que las vistas web hayan terminado de cargarse. ¿Cómo puedo cambiar la altura de una celda de tabla después de que ya se haya cargado?

Lo ideal es que pueda usar una línea de código como esta.

cellW.frame = cellW.cellWebView.frame; 

Sin embargo, no parece tener acceso a la información de celda en heightForRowAtIndexPath. Me sentí como si hubiera explicado la situación bastante bien, pero cualquier código que crees que debería publicar puedo ponerlo aquí. He intentado muchas cosas (por lo que hay comentarios e bashs fallidos en todo esto), pero el problema principal es que no puedo acceder a la información de la celda en los lugares correctos, como heightForRowAtIndexPath. Si pudiera incluso configurar la información de la célula de alguna manera en webViewDidFinishLoad, simplemente podría establecer el marco de la celda donde también estoy estableciendo el tamaño de fotogtwig de la vista web.

A continuación se muestra la configuration de la subclass de la celda de la tabla.

 #import <UIKit/UIKit.h> #import "DefinitionsAndConstants.h" @interface UITableViewCellWebView : UITableViewCell { UIWebView *cellWebView; } @property (nonatomic,retain) UIWebView *cellWebView; @end 

Esto es lo que he intentado por última vez tratando de usar el código de parte de Gavin. Pero, por supuesto, no hay forma de establecer la celda de la tabla ahora que he salido porque cellForRowAtIndexPath no es asignable.

 -(void)webViewDidFinishLoad:(UIWebView *)webViews { [webViews stringByEvaluatingJavaScriptFromString:@"twitterfy()"]; [webViews stringByEvaluatingJavaScriptFromString:@"document.getElementById('tweettext').innerHTML=tweet"]; NSString* h = [webViews stringByEvaluatingJavaScriptFromString:@"getDocHeightMax()"]; int height = [h intValue]; webViews.frame = CGRectMake(0.0f, 0.0f, 320.0f, height); NSString* i = [webViews stringByEvaluatingJavaScriptFromString:@"return indexPath"]; int ii = [i intValue]; NSIndexPath* ip = [NSIndexPath indexPathForRow:ii inSection:0]; UITableViewCellWebView *tableCell = (UITableViewCellWebView *)[self.tableView cellForRowAtIndexPath:ip]; if (tableCell) { tableCell.frame = webViews.frame; } NSLog(@"Got height from webview %d", height); } 

Configuraré una matriz mutable para leer alturas desde. En viewDidLoad , tendrás que asignar algunos valores iniciales (probablemente solo un montón de @"44.0" , realmente no importa, no se usará para mucho todavía). En your heightForRowAtIndexPath: simplemente devuelve el número de esa matriz. Luego, en webViewDidFinishLoad , reemplace las alturas de la matriz con la altura que realmente necesita para esa celda (la NSString *h en el código que publicó, creo) y llame a reloadData en la vista de la tabla. reloadData alcanzará heightForRowAtIndexPath: que verá la matriz de alturas, que ahora tiene la altura real necesaria para esa celda, por lo que todo debe ser shiny.

Debería poder hacer algo como esto para su método heightForRowAtIndexPath:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { MyTableViewCell *tableCell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; if (tableCell) { return tableCell.cellWebView.frame.size.height; } return 44; } 

De esta manera, si la celda de la tabla está visible, configurará la altura de acuerdo con la altura de la vista web incrustada, de lo contrario, usará una altura pnetworkingeterminada. Para que la vista de tabla actualice la altura de la celda, tendrá que llamar a la siguiente vez que la vista web tenga el tamaño adecuado:

 [self.tableView beginUpdates]; [self.tableView endUpdates]; 

Eso no hará que se vuelvan a cargar las celdas, lo que podría arruinar las cosas por usted, simplemente hará que compruebe las alturas nuevamente, y la altura de la celda se animará a la nueva altura.