2013-12-18 34 views
3

当前我有webviews加载在自定义的uitableview单元格中。问题是Web视图具有可变大小。在webViewDidFinishLoad中,我可以根据html文档的实际大小设置Web视图的大小。我的问题是在web视图完成加载之前已经将其高度设置在heightForRowAtIndexPath中的表格单元格。如何在表格单元格已被加载后更改表格单元格的高度?如何更改已经加载的表格单元格的高度?

理想情况下,我觉得我应该能够使用这样的代码行。

cellW.frame = cellW.cellWebView.frame; 

但是,我似乎无法访问heightForRowAtIndexPath中的单元格信息。我觉得我已经很好地解释了这种情况,但是你认为我应该发布的任何代码都可以放在这里。我已经尝试了很多东西(所以在这个地方有评论和失败的尝试),但主要问题是我似乎无法在正确的位置访问单元格信息,例如heightForRowAtIndexPath。如果我甚至可以在webViewDidFinishLoad中以某种方式设置单元格信息,那么我可以简单地设置单元格的框架,并在其中设置Web视图的框架大小。

下面是我的表格单元格子类的设置。

#import <UIKit/UIKit.h> 
#import "DefinitionsAndConstants.h" 

@interface UITableViewCellWebView : UITableViewCell 
{ 
    UIWebView *cellWebView; 
} 

@property (nonatomic,retain) UIWebView *cellWebView; 
@end 

这是我试过最后尝试使用部分Gavin的代码。但当然,现在无法设置表格单元格,因为cellForRowAtIndexPath不可分配。

-(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); 
} 
+0

我的确发现了与此相关的其他问题,但他们都没有处理动态细胞高度。 – Caimen

+0

你在哪里加载您的网页浏览?如果你只是在'viewDidLoad'中做,它应该在绘制表之前加载,对吧?对不起,如果这是一个愚蠢的问题 - 我以前没有使用过网页浏览。 – GeneralMike

+0

Web视图在那里加载,但直到在heightForRowAtIndexPath已经执行之后的webViewDidFinishLoad才完成呈现内容。因此,直到webViewDidFinishLoad才计算内容的高度。 – Caimen

回答

1

我会设置一个可变数组来读取高度。在viewDidLoad,你必须分配一些起始值(可能只是一堆@"44.0",它并不重要,它不会被使用很多)。在您的heightForRowAtIndexPath:中,只需返回该数组中的数字即可。然后在webViewDidFinishLoad中,将阵列中的高度替换为该单元实际需要的高度(我相信您发布的代码中的NSString *h),然后在您的表格视图上调用reloadDatareloadData将会打到heightForRowAtIndexPath:,它会查看高度数组,它现在具有该单元所需的实际高度,所以一切都应该闪亮。

+1

我喜欢这个想法,我只是尝试过,但正如我怀疑reloadData重绘单元格并导致Web视图再次呈现,导致无限循环。由于Web视图只在单元格可见时进行呈现,因此向下滚动会导致更疯狂的无限循环。视图看起来大部分是正确的,但是直到无限循环中不可避免的崩溃才开始波涛汹涌。 – Caimen

+1

我想我可能需要说一些类似的话,当数组中的正确行已经被填充时,不要重载数据。我会再测试一下,让你知道它是如何发展的。 – Caimen

+0

@ Caimen:嗯,你需要重画'cellForRowAtIndexPath:'中的webviews吗?当用户与它交互时是否可以改变它?我会被强迫建立'viewDidLoad'中的所有单元格,将它们放到一个数组中,并且将单元格​​从'cellForRowAtIndexPath:'中取出,而不是使用'reuseIdentifier'。看起来我使用表视图获得的经验越多,我越喜欢构建单元然后用它完成的想法(而不是像我需要的那样在'cellForRowAtIndexPath'中构建它们)。 – GeneralMike

0

你应该能够为您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; 
} 

这样,如果表格单元格是可见的,它会设置高度嵌入式web视图,否则它将使用默认高度。为了使表视图刷新单元的高度,你就必须调用下面一旦Web视图尺寸是否:

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

这不会让它重新加载细胞,这可能螺丝为了你,它只会让它再次检查高度,单元格高度将生成新的高度。

+0

这看起来正是我所需要的。 但是 UITableViewCellWebView * tableCell =(UITableViewCellWebView *)[self.tableView cellForRowAtIndexPath:indexPath];不断返回EXC_BAD_ACCESS。我对这个问题还不熟悉,但我猜这是一个迹象,我有一些更深层次的问题需要我先解决。谢谢您的帮助。 – Caimen

+2

UITableViewCellWebView是你的'UITableViewCell'的子类,还是'UIWebView'的子类? – Gavin

+0

它是UITableViewCell的子类。我在问题中发布了我的子类。 – Caimen

相关问题