weex web获取html高度,UIWebView和WKWebView加载网页获取内容高度

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)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {

[webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id data, NSError * _Nullable error) {

CGFloat height = [data 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)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

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,这个时候就能获取到了

当然这只是我在做项目的过程中所遇到的问题,并多次尝试解决的,也不一定适合所有的情况,若是有别的情况,或者有更多更好的方法欢迎交流学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值