将UIWebView调整为其内容大小

5
在UITextView中,我可以像这样调整控件的高度以适应其内容:
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;

但我想使用UIWebView来展示富文本。UIWebView的内容如下:

NSString *myDescriptionHTML = [NSString stringWithFormat:@"<html> \n"
                                  "<head> \n"
                                  "<style type=\"text/css\"> \n"
                                  "body {font-family: \"%@\"; font-size: %@; }\n"
                                  "</style> \n"
                                  "</head> \n"
                                  "<body>%@</body> \n"
                                  "</html>", @"helvetica",
                                  [NSNumber numberWithInt:12], @"yadayadayada..."];
[webView loadHTMLString:myDescriptionHTML baseURL:nil];

因此,UIWebView仅包含纯文本。我如何实现与上述UITextView代码类似的结果?

可能是UIWebView调整大小以适应内容的重复问题。 - jscs
6个回答

14

虽然理论上提供了JavaScript方法

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

对于大多数人,这个方法应该是可行的,但对我来说似乎并没有起作用。我尝试了很多种变化,但它总是返回一个与真实内容高度无关的大小。例如,一行代码会得出260或244的高度。不知道为什么(想知道原因)。

因此,我最终按照这个答案中的提示进行操作:

- (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;

    NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}

我认为使用JS的方式更加优雅,但是该方法对我无效,而我也不能弄清楚为什么,而另一种方法却可以直接奏效。


2

和Micheal建议的类似,您可以在webview的webViewDidFinishLoad回调中调用javascript来获取内容的高度。

示例(未经测试):

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

这是基于Appcelerator Titanium中使用的一种方法,根据高度调整其Web视图大小,如果用户将高度设置为“auto”https://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiUIWebView.m#L616


1
如果您使用loadHTMLString:baseURL:第二次加载更长的HTML页面,则可以使UIWebView变得更大,但是如果使用较短的HTML页面,则不会变小。在加载新的HTML字符串时,使用“document.body.clientHeight”来进行JavaScript调整和增加UIWebView的高度。 - Mr. Berna

2

我知道这个问题有点老,但我找不到更近期的解决方案。最终我采用了这个方法。如果使用约束条件,则此方法有效。

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    // get content size
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    // ajust the height constraint of the webview to the content size
    [self.webviewHeightConstraint setConstant:fittingSize.height];
}

1

这个问题并没有一个简单的答案,因为 UIWebView 是一个复杂的滚动视图。有一些你可以尝试的方法,所有的操作都必须在 UIWebView 的委托接收到网页加载完成的通知后执行(使用webViewDidFinishLoad:)。一旦委托知道了 UIWebView 已经加载完毕,我会尝试以下几点:

  • 尝试相同的contentSize技巧,如果页面已经加载完成,这种方法可能会奏效。
  • 使用JavaScript获取高度,像这样:

    CGFloat windowHeight = [[webView stringByEvaluatingJavaScriptFromString:@"return document.body.scrollHeight;"] floatValue];

然后,按照任何其他视图的方法处理高度。


1

这是您要找的吗?? UIScrollView *scroll= [[webView subviews]objectAtIndex:0]; CGFloat flo= scroll.contentSize.height;


0

代码可以缩短一下吗?

_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, 1);
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, fittingSize.height);

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