如何计算WKWebView的内容高度?

Moo*_*ght 9 wkwebview

对于UIWebView,我们可以通过以下方式获得内容高度:

[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"]
Run Code Online (Sandbox Code Playgroud)

但是WKWebView没有这个方法,webView.scrollView.contentSize.height不对.

(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
    {
    }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

mor*_*ter 10

我用KVO解决了这个问题.

首先,addObserver for WKWebView的scrollView的contentSize如下:

addObserver(self, forKeyPath: "webView.scrollView.contentSize", options: .New, context: nil)
Run Code Online (Sandbox Code Playgroud)

接下来,收到这样的变化:

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    if keyPath == "webView.scrollView.contentSize" {
        if let nsSize = change[NSKeyValueChangeNewKey] as? NSValue {
            let height = nsSize.CGSizeValue().height
            // Do something here using content height.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

获取webview的内容高度很容易.

不要忘记删除观察者:

removeObserver(self, forKeyPath: "webView.scrollView.contentSize", context: nil)
Run Code Online (Sandbox Code Playgroud)

我知道这条线deinit.


ars*_*ius 2

你可以这样得到它:

self.webview.navigationDelegate = self;

- (void)webView:(WKWebView *)webview didFinishNavigation:(WKNavigation *)navigation{
     // webview.scrollView.contentSize will equal {0,0} at this point so wait
     [self checkIfWKWebViewReallyDidFinishLoading];
}


- (void)checkIfWKWebViewReallyDidFinishLoading{
      _contentSize = _webview.scrollView.contentSize;
      if (_contentSize.height == 0){
           [self performSelector:@selector(WKWebViewDidFinishLoading) withObject:nil afterDelay:0.01];
      }
}
Run Code Online (Sandbox Code Playgroud)