对于UIWebView,我们可以通过以下方式获得内容高度:
[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"]
但是WKWebView没有这个方法,并且webView.scrollView.contentSize.height不对。
(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
}
感谢您的帮助!
答案 0 :(得分:9)
我用KVO解决了这个问题。
首先,addObserver for WKWebView的scrollView的contentSize如下:
addObserver(self, forKeyPath: "webView.scrollView.contentSize", options: .New, context: nil)
接下来,收到这样的变化:
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.
}
}
}
很容易获得webview的内容高度。
不要忘记删除观察者:
removeObserver(self, forKeyPath: "webView.scrollView.contentSize", context: nil)
我在deinit
中对这一行作了表示。
答案 1 :(得分: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];
}
}
答案 2 :(得分:2)
修改强>
为了获得最佳的身高计算,最后我做了一些事情以获得最佳身高:
以上为我获得了最准确的结果。
<强> ORIGINAL:强>
我已经尝试过滚动视图KVO,我尝试使用clientHeight
,offsetHeight
等来评估文档上的javascript ...
最终对我有用的是:document.body.scrollHeight
。或者使用最顶层元素的scrollHeight
,例如容器div
。
我使用KVO听取loading
WKWebview属性更改:
[webview addObserver: self forKeyPath: NSStringFromSelector(@selector(loading)) options: NSKeyValueObservingOptionNew context: nil];
然后:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
if(object == self.webview && [keyPath isEqualToString: NSStringFromSelector(@selector(loading))]) {
NSNumber *newValue = change[NSKeyValueChangeNewKey];
if(![newValue boolValue]) {
[self updateWebviewFrame];
}
}
}
updateWebviewFrame
实施:
[self.webview evaluateJavaScript: @"document.body.scrollHeight" completionHandler: ^(id response, NSError *error) {
CGRect frame = self.webview.frame;
frame.size.height = [response floatValue];
self.webview.frame = frame;
}];
答案 3 :(得分:0)
WKWebView didn't finish loading, when didFinishNavigation is called - Bug in WKWebView? WKWebView不会使用委派来告知您内容加载完成的时间。 您可以创建一个新线程来检查WKWebView的状态。
override func viewDidLoad() {
super.viewDidLoad()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
while(self.webView?.loading == true){
sleep(1)
}
dispatch_async(dispatch_get_main_queue(), {
print(self.webView!.scrollView.contentSize.height)
})
})
}