无法获得wkWebView的正确高度?

时间:2017-11-03 03:20:38

标签: ios swift webview uiscrollview contentsize

我已经阅读了很多关于如何获得webView高度的文章。他们中的大多数使用KVO来观察contentSize。我也这样做了。

1)创建wkWebView并禁止webView的scrollView

 lazy var webView: WKWebView = WKWebView()

 webView.scrollView.bounces = false
 webView.scrollView.isScrollEnabled = false

 webView.snp.makeConstraints({ (make) in
        make.left.right.equalTo(view)
        make.top.equalTo(headerView.snp.bottom)
        make.height.equalTo(AppDefaults.screenH - 64 - 44)
        make.bottom.equalTo(containView)
    })

2)添加观察者

webView.scrollView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "contentSize" {
        if let scroll = object as? UIScrollView {
            if scroll.contentSize.height > 0 {
                updateWebViewConstraints(scroll.contentSize.height)
            }
        }
    }
}

func updateWebViewConstraints(_ height: CGFloat) {
    webView.snp.remakeConstraints { make in
        make.left.right.equalTo(view)
        make.top.equalTo(headerView.snp.bottom)
        make.height.equalTo(height)
        make.bottom.equalTo(containView).offset(-44)
    }
}

3)删除观察者

deinit {
    webView.scrollView.removeObserver(self, forKeyPath: "contentSize")
}

当我运行应用程序时,有时我可以获得正确显示的webView的正确高度。如下图所示

enter image description here

enter image description here

但有时候,webView的高度超过了正确的高度,这会导致webView有一部分空白空间。我们可以看到下面的图片,它得到了错误的contentSize,

enter image description here enter image description here

当我点击nextButton来加载新内容时,它也会保持之前的高度。这不好。就像contentSize的高度超过新内容的高度一样。它不会改变。

为了比较wkWebView,所以我尝试了UIWebView,这是正确的。所以,我不知道如何解决这个问题。请给我一些建议。感谢

2 个答案:

答案 0 :(得分:0)

如果您呈现的网页的contentSize小于bounds的{​​{1}},则WKWebView将至少与{contentSize相同1}},这会产生一个空格。

解决此问题的唯一方法是将bounds的{​​{1}}设置为小于内容大小的内容。页面呈现后,您将知道bounds的{​​{1}}的大小,您可以使用上面的逻辑对其进行调整。

答案 1 :(得分:0)

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        self.webViewHeightConstraint?.constant = 0
        self.view.layoutIfNeeded()
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        self.webViewHeightConstraint?.constant = webView.scrollView.contentSize.height
        self.view.layoutIfNeeded()
    }
}

我遇到了同样的问题。根据runmad的解决方案,在加载前将高度设置为零,然后在工作后将高度设置为正确。