5

好的,所以我知道这个问题已经被问过了。有很多好的建议,但我无法按预期工作。我正在尝试创建一个 tableview 单元格,它可以根据不同的 html 动态设置其加载高度。大家的建议是使用下面的方法。

-(void)webViewDidFinishLoad:(UIWebView *)webView 

他们说要使用javascript计算高度,如下所示:

NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; 

或者做这样的事情(我创建了这个):

self.webView = webView;
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;

这两种方法都返回 webview 的正确高度,但它们发生在 tableview 初始化之后。这个 webViewDidFinishLoad 在 heightForRowAtIndexPath 方法之后被调用。因此,在构建表格时,我没有单元格的高度。因此,每个人都说好,然后在您的 webViewDidFinishLoad 中重新加载表格视图,这又可以工作了,但我不喜欢这样,因为存在滞后,并且当您到达该部分时,它会使表格视图的滚动不连贯。我怎样才能解决这个问题?并使其顺利?我在想也许在加载视图之前以某种方式确定 webview 的高度,但不知道我会怎么做。还尝试将 html 转换为纯文本字符串,但这会导致错误高度,因为 html 有空格和内容,而纯文本没有。任何帮助,将不胜感激!

4

3 回答 3

3

我的建议与@Timothy Moose 非常相似,将webview 渲染到屏幕外。

我会在这里采取的方法是......

-(void)viewDidLoad
{
     //Create a UIWebView and store it in a property
     //Hook the delegate to the view controller.
     //Load the html string to the UIWebView.

     //The rest of your initialization
}

在这种情况下,您heightForRowAtIndexPath:仍然可能会在 Web 视图完成之前被调用。

你可以通过几种方式来处理它。这是一个建议。

在 UIWebView 的委托方法中webViewDidFinishLoading,检查以确保进行调用的 webview 是存储在您的属性中的 webview。如果是这样,请调用以重新加载您的 webview 所在的部分(或行)。这应该调用该heightForRowAtIndexPath:方法以再次调用,在这种情况下,您可以将 webview 的高度存储在webViewDidFinishLoading回调中。

如果第一次显示视图时单元格不在屏幕上,则在 中创建的单元格cellForRowAtIndexPath:应该具有UIWebView您在viewDidLoad. 通过添加UIWebView到单元格的内容视图来做到这一点。

如果第一次显示视图时单元格在屏幕上,我建议在第一次加载单元格时使用活动微调器,然后在 webview 完成加载后,使用 webview 重新加载单元格。

于 2013-05-24T19:42:28.870 回答
2

归根结底,在加载之前,您无法知道 webview 内容的高度。如果设置表格和加载 webview 的代码相同,则 webview 总是会在表格显示后完成它的加载。

如果您重复加载相同的 HTML,您可以缓存高度,但您仍然会在第一次时遇到问题。

因此,您要能够显示滚动表格视图而不会断断续续的唯一方法是在加载 web 视图之前拥有默认的单元格高度。然后改变它。但是你已经尝试过了,使用reload. 那是波涛汹涌的。

但是,单元格高度在默认高度和真实高度之间动画呢?也许这样会更容易接受。

如果您只更改高度,我相信您可以这样做而不是重新加载,以便为调整大小设置动画。

[tableView beginUpdates];
[tableView endUpdates];

两条线之间不需要任何东西。

也许您可以将此与缓存 HTML 的真实高度结合起来,以便下次用户将其滚动到视图中。

于 2013-05-25T17:58:01.317 回答
0

在您的情况下,您在 tableviewcell 中有 webview,因此在 heightForRowAtIndexPath 中将单元格的高度设置为 NSAttributedString 大小的高度,如下所示。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{


    NSAttributedString *attributedText = [NSString  getHTMLAttributedString:@"HTML Content"];
    CGSize size = CGSizeMake(300, CGFLOAT_MAX);
    CGRect paragraphRect =     [attributedText boundingRectWithSize:size
                                 options:(NSStringDrawingUsesLineFragmentOrigin)
                                 context:nil];
    return paragraphRect.size.height;
}

+(NSAttributedString *) getHTMLAttributedString:(NSString *) string{
    NSError *errorFees=nil;
    NSString *sourceFees = [NSString stringWithFormat:
                            @"<span style=\"font-family: 'Roboto-Light';font-size: 14px\">%@</span>",string];
    NSMutableAttributedString* strFees = [[NSMutableAttributedString alloc] initWithData:[sourceFees dataUsingEncoding:NSUTF8StringEncoding]
                                                                                 options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                                           NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]}
                                                                      documentAttributes:nil error:&errorFees];
    return strFees;

}
于 2015-11-04T06:04:02.803 回答