webview加载网页获取高度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webview加载网页获取高度相关的知识,希望对你有一定的参考价值。
#UIWebView获取网页高度
> 方法一
根据webview内嵌的scrollView的contentSize.height去计算高度:
-(void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat height = 0.0; [webView sizeToFit]; height = webView.scrollView.ContentSize.height; CGRect webFrame = webView.frame; webFrame.size.height = height; webView.frame = webFrame; }
> 方法二
-(void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat height = [[webView stringByEvaluatingjavascriptFromString:@"document.body.offsetHeight"] floatValue]; //ps:js可以是上面所写,也可以是document.body.scrollHeight;个人觉得两者在UIWebView中都可以,但是在WKWebView中就不同了,后面会有介绍 CGRect webFrame = webView.frame; webFrame.size.height = height; webView.frame = webFrame; }
> 方法三:遍历UIWebView的所有子视图,找到中间的UIWebViewScrollView或者UIWebBrowserVeiw,获取到它的frame设定给webView
-(void)webViewDidFinishLoad:(UIWebView *)webView { if(webView.subViews.count > 0) { for(UIView *view in webView.subViews) { // if([view iskindOfClass:NSClassFromString:@"UIWebViewScrollView"]){ // webView.frame = view.frame; // } UIScrollView *scrollView = webView.subViews[0]; for (UIView *view in scrollView.subViews) { if([view iskindOfClass:NSClassFromString:@"UIWebBrowserVeiw"]){ webView.frame = view.frame; } } } }
> ps:经过验证,以上三种方法都是可行的,但是会出现一个问题,有的时候依然获取不到高度,或者高度不正确,这个时候有一个处理方法,是在didFinishLoad里面第一次获取之后隔一到两秒再获取一次,就可以获取到了,至于原因,我也不知道。
#WKWebView获取内容高度
> 方法一
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { CGFloat height = 0.0; [webView sizeToFit]; height = webView.scrollView.ContentSize.height; CGRect webFrame = webView.frame; webFrame.size.height = height; webView.frame = webFrame; }
> 方法二
-(void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat height = [[webView stringByEvaluatingJavascriptFromString:@"document.body.offsetHeight"] floatValue]; //ps:js可以是上面所写,也可以是document.body.scrollHeight;在WKWebView中前者offsetHeight获取自己加载的html片段,高度获取是相对准确的,但是若是加载的是原网站内容,用这个获取,会不准确,改用后者之后就可以正常显示,这个情况是我尝试了很多次方法才正常显示的 CGRect webFrame = webView.frame; webFrame.size.height = height; webView.frame = webFrame; }
> 方法三:遍历WKWebView的所有子视图,找到中间的WKContentView,获取到它的frame设定给webView
-(void)webViewDidFinishLoad:(UIWebView *)webView { if(webView.subViews.count > 0) { for(UIView *view in webView.subViews) { if([view iskindOfClass:NSClassFromString:@"WKContentView"]){ webView.frame = view.frame; } }
> ps:两种webview的第三种方法需要自己打印出来webView.subViews去观察一下,有很大不同,前两种方法是比较常用的,一般情况下能满足要求,特别一点是:我在做项目的时候发现,有时候第一次获取高度是获取不到的,这个时候我就强制在第一次获取之后隔1s再去获取一次,刷新webView,这个时候就能获取到了
> 当然这只是我在做项目的过程中所遇到的问题,并多次尝试解决的,也不一定适合所有的情况,若是有别的情况,或者有更多更好的方法欢迎交流学习
# WKWebView的相关内容
> WKWebView在加载含有https的网址时,需要做特殊的处理,否则可能会发生程序奔溃的问题,具体的方法如下:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil); }
以上是关于webview加载网页获取高度的主要内容,如果未能解决你的问题,请参考以下文章
WebView加载不出Html5网页的解决方法,android studio 拾色器,ViewPager高度问题