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);
}
时间: 2024-10-07 20:16:46

webview加载网页获取高度的相关文章

Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie

最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可查看Cookie信息. 如图: Http请求获取Cookie信息: public static String request(String httpUrl, String params, Context context) { BufferedReader reader = null; String result = null; String httpurl = " http://xwwscs.com"

webview加载网页与全屏播放视频?

上篇我们大致了解了webview的一些属性,以及重要的方法.这篇我们就要一些案列来说明,一般webview最广泛的作用就是,加载一个html的网页(实现与js交互),,webview加载网页网页当中含有视频,webview文件下载等等. 首先我们来了解下webview是如何加载网页的?首先我们看下网页在家的效果? 代码也是比较简单 1 package cn.xiao.webviewplayvideo; 2 import android.app.Activity; 3 import android

Android中webview加载网页无法点击或滚动

由于工作忙,很久没写博客了,今天就先来一篇吧,这也是项目中遇到的问题. 如题,webview加载网页,但是网页内容无法滚动和点击,且网页内容也没有正常全部展示,主要是因为没有正确setting而已,解决访求如下: WebSettings s = webview.getSettings(); s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); s.setUseWideViewPort(true); s.setLoadW

WebView 加载网页和java 与js交互

[mw_shl_code=java,true]WebView是一个可以显示网页的控件.需求:通过WebView加载assets下的html文件.实现页面的缩放.向menu键添加:前进.后退和刷新,实现对网页的操作点击网页中的链接,仍然使用本WebView浏览器,而非调用系统的浏览器网页中有button,点击button,调用android的Toast点击WebView隐藏地址栏和button,点击menu键显示地址栏和button.WebView加载网页的方式WebView webview =

【android】只让本应用程序的webview加载网页而不调用外部浏览器的办法

只让本应用程序的webview加载网页,而不调用外部浏览器打开的办法就是:设置WebViewClient,并重写WebViewClient的shouldOverrideUrlLoading方法返回true mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated

WebView加载网页

WebView加载网页 一.新建一个android项目   新建android项目,应用默认配置,其他地方不做修改. 二.修改MainActivity package cn.qiu.webview; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webki

iOS之webview加载网页、文件、html的方法

UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf.word.doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽  2.通过alloc init 来初始化 创建webview,下列文本中 _webView.dataDetectorTypes = UIDataDetectorTypeAll; 是识别webview中的类型,例如 当webview中有电话号码,点击号码就能直接打电话 - (UIWebView *)webView

使用webview加载网页时session同步

直接调用Android的webview加载URL时,由于需要登录的session导致URL无法显示,解决方案是在需要访问的URL中加session: String reporturl = "http://xxx.xxx.xx"; CookieSyncManager.createInstance(getApplication()); CookieManager cookieManager = CookieManager.getInstance(); CookieSyncManager.g

android 使用webview加载网页问题

我在做图片站http://www.mimi199.com时要将其移动站打包成app, 我使用的是webview来加载网页(本来想使用phonegap来做来,但是还是太麻烦了), 具体代码如下: protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState); WebView webView=new WebView(this);         webView.loadU