如何根据HTML内容设置UIWebView的高度?

17

我希望根据HTML内容设置UIWebview的高度。 我可以获取字符串的大小,但由于段落、加粗、不同字体大小等原因,无法获取实际大小。


1
你尝试过什么?(http://whathaveyoutried.com) - thegrinner
Webview已经有滚动条了,所以你可能不需要它。 - alexandresoli
我在UITablView的每一行中都有一个webview。在heightForRowAtIndexPath中,我无法获取每一行的webview高度。因此,我很困惑如何设置heightForRowAtIndexPath中的每一行高度。 - KPIteng
5个回答

13

我通常使用以下方法,将 UIWebview 的框架设置为其内容大小:

- (void)webViewDidStartLoad:(UIWebView *)webView {
    CGRect frame = webView.frame;
    frame.size.height = 5.0f;
    webView.frame = frame;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    CGSize mWebViewTextSize = [webView sizeThatFits:CGSizeMake(1.0f, 1.0f)]; // Pass about any size
    CGRect mWebViewFrame = webView.frame;
    mWebViewFrame.size.height = mWebViewTextSize.height;
    webView.frame = mWebViewFrame;

    //Disable bouncing in webview
    for (id subview in webView.subviews) {
        if ([[subview class] isSubclassOfClass: [UIScrollView class]]) {
            [subview setBounces:NO];
        }
    }
}

如果你将webView的代理设置为这个类,它们会自动被调用,当WebView完成加载其内容时。


3
为什么要迭代子视图来查找滚动视图?直接使用webView.scrollView即可。我认为你只需要在viewDidLoad中设置反弹效果,因为它只需要执行一次。(这仍然是一个好答案。) - griotspeak
谢谢您的评论 - 主意不错 :) 。我发布的代码真的很旧,是在scrollview无法直接访问的时候编写的。 - Guntis Treulands

8

每个网页视图内部都有一个UIScrollView,因此我建议等待页面加载完成后,获取scroll view的contentSize属性来确定页面高度。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat height = webView.scrollView.contentSize.height;
}

在这段代码中,height是什么?它是Web视图高度的任何属性吗? - User558

6
尝试使用这段代码。
- (void)webViewDidFinishLoad:(UIWebView *)webView
{     
    height= [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
}

1
- (void)viewDidLoad
{
    [super viewDidLoad];
    webview.delegate = self;
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    NSLog(@"height: %@", output);
}

另请参阅如何在可变高度的UITableView中根据内容确定UIWebView的高度?

根据其内容计算UIWebView的高度


2
但是我在UITableView中有UIWebview,每一行都有UIWebView,所以我该如何计算高度呢?因为table height在cellForRowAtIndex被调用之前就已经设置好了。 - KPIteng

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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接