精确计算UIWebView内容的高度

时间:2022-08-24 23:21:45

搜集了网上各大博客以及技术论坛,能够获取UIWebView的内容高度有以下两个方法,相关代码如下:
方法一:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//再设置高度
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
frame.origin = CGPointMake(0, frame.origin.y);
//frame.size.height就是内容高度了
}

方法二:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
CGFloat webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue];
CGRect frame = webView.frame;
frame.size.height = webViewHeight;
webView.frame = frame;
}

然而,笔者在使用以上两种方法的时候,都出现了第一次使用UIWebView的时候,高度算得不准的情况(基本上都是少一点),使得出现UIWebView中的文字被截断的情况。原因是:viewDidFinishLoad方法只是在内存中加载完了html代码,然而并没有渲染到UIWebView上面去,所以重新渲染后的真实高度和viewDidFinishLoad所获取的高度有一定的偏差,所以我们应该在UIWebView渲染完后,再获取高度,这时候才是最精确的。


其中JavaScript中有一个方法,可以在UIWebView渲染完毕html后执行,相关代码如下:

window.onload = function() { 
//code
}

window.onload方法会在UIWebView渲染之后调用,所以我们可以在这个里面写一个url请求,把高度带过去,然后在UIWebView的代理方法webView:shouldStartLoadWithRequest:navigationType:中拦截这个请求,获取高度,这时候获取的高度就是准确的了,JavaScript代码如下:

window.onload = function() { 
window.location.href = "ready://" + document.body.scrollHeight;
}

代理方法代码如下:

- (BOOL)webView:(UIWebView*)webView 
shouldStartLoadWithRequest:(NSURLRequest*)request
navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [request URL];
if (navigationType == UIWebViewNavigationTypeOther) {
if ([[url scheme] isEqualToString:@"ready"]) {
float contentHeight = [[url host] floatValue];
CGRect fr = webview.frame;
fr.size = CGSizeMake(webview.frame.size.width, contentHeight);
webview.frame = fr;
return NO;
}
}
return YES;
}

PS:你可以把JavaScript代码放在你的html代码的前面或者后面

相关参考