UIWebView en una UITableViewCell con tamaño dynamic

Tengo objects UIWebView en múltiplos UITableViewCell . Cada webView tiene un tamaño diferente. Originalmente, todas las celdas tienen la misma altura. Una vez que el usuario toque la celda, se expandirá para mostrar todo el contenido de WebView.

Estoy usando - (void) webViewDidFinishLoad:(UIWebView *)aWebView para get dinámicamente la altura de la vista web, y - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath para cambiar el tamaño de la celda. Sin embargo, webViewDidFinishLoad solo se llama después del método de cambio de tamaño, por lo tanto, el cambio de tamaño se realiza utilizando valores anteriores para la altura de la vista web.

Traté de llamar ambos methods manualmente en el order deseado, pero funcionó (no creo que deba hacer esto en absoluto, de todos modos …).

Aquí está mi código para cargar la vista web en cada celda:

  [self.webView setUserInteractionEnabled:NO]; [self.webView loadHTMLString:finalString baseURL:nil]; [cell addSubview:self.webView]; cell.accessoryView = accessoryLabel; cell.textLabel.text = nil; self.selectedRowIndex = indexPath.row; [tableView beginUpdates]; [tableView endUpdates]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

Para get dinámicamente el tamaño de celda:

 - (void) webViewDidFinishLoad:(UIWebView *)aWebView { CGRect frame = aWebView.frame; frame.size.height = 1; aWebView.frame = frame; CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; aWebView.frame = frame; self.cellSize = fittingSize.height; NSLog(@"Calling webViewDidFinishLoad. Cell size value: %lf", self.cellSize); } 

Para cambiar el tamaño de celda:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath { if(indexPath.row == self.selectedRowIndex) { NSLog(@"Resizing cell with size: %lf", self.cellSize); return self.cellSize + 10; } return 44; } 

Así es como se ve la salida:

 2015-02-24 22:59:08.902 testProject[62200:2703641] Resizing cell with size: 0.000000 2015-02-24 22:59:09.064 testProject[62200:2703641] Calling webViewDidFinishLoad. Cell size value: 501.000000 

¿Hay alguna forma de cambiar el tamaño de la celda solo después de que webViewDidFinishLoad se haya ejecutado?

¡¡Realmente aprecio cualquier ayuda!!

Todavía no sé por qué sucede esto, pero lo resolví usando el siguiente enfoque:

[tableView beginUpdates] y [tableView endUpdates] al método webViewDidFinishLoad . De esta manera, cuando se ejecuta webViewDidFinishLoad , actualizará correctamente el tamaño de celda. Aunque no creo que sea la mejor solución, funciona.

Ahora, mi método webViewDidFinishLoad se ve así:

 - (void) webViewDidFinishLoad:(UIWebView *)aWebView { CGRect frame = aWebView.frame; frame.size.height = 1; aWebView.frame = frame; CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; aWebView.frame = frame; self.cellSize = fittingSize.height; [self.tableView beginUpdates]; [self.tableView endUpdates]; NSLog(@"Calling webViewDidFinishLoad. Cell size value: %lf", self.cellSize); } 

Quizás la respuesta ayude a otra persona con problemas similares.

Para evitar bucle infinito. la key es si ya obtuviste la altura de la vista web, simplemente regrésalo en el método webViewDidFinishLoad. Mi webViewDidFinishLoad se ve así:

  // If the height is already exist, just return to prevent the infinite loop // The default height is 0.0 if ([[self.webviewHeightDic objectForKey:[NSString stringWithFormat:@"%ld",(long)webView.tag]] floatValue] != 0.0) { return; } CGRect frame = webView.frame; frame.size.height = 1; webView.frame = frame; CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; frame.size = fittingSize; webView.frame = frame; NSLog(@"Cell height = %f ",fittingSize.height); // Set the height to the target webview [self.webviewHeightDic setObject:[NSNumber numberWithFloat:fittingSize.height] forKey:[NSString stringWithFormat:@"%ld",(long)webView.tag]]; // Refresh the tableView [self reloadData]; 

Tengo curiosidad si tiene algo que ver con el order en que haces las cosas. ¿Puedes intentar hacer esto?

 [cell addSubview:self.webView]; self.webView.frame = ... create frame with cell width and height set to 1 ... [self.webView loadHTMLString:finalString baseURL:nil]; 

La solución de trabajo para mí es usar KVO. Tenga cuidado al remover al observador. Ya sea en didEndDisplayingCell o en viewWillDisappear

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) cell.webview.addObserver(self, forKeyPath: "scrollView.contentSize", options: NSKeyValueObservingOptions.New, context: &context) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String: AnyObject]?, context: UnsafeMutablePointer<Void>) { if let webview = object as? UIWebView { let cs = webview.scrollView.contentSize } }