首页 > 解决方案 > 在 WKWebView 中获取静态页面的最终呈现高度

问题描述

在我的应用程序中,我使用的WKWebView是加载带有静态内容的网页。

一旦contentSize网页完全呈现在WKWebView.

所以我想我可以使用webView:didFinishNavigation:委托:

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.navigationDelegate = self
        webView.uiDelegate = self

        webView.load(URLRequest(url: URL(string: "https://www.rockade.nl/testpage/testpage.php")!))
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("finished loading: height=\(webView.scrollView.contentSize.height)")
    }

}

我对这段代码的问题是,在页面完全呈现之前调用了这个委托,所以我得到了不同的高度结果,甚至是 0 的值。

当我添加一个小的延迟时,我得到了正确的结果,但这感觉就像一个黑客。

使用这样的观察者

var myContext = 0
webView.scrollView.addObserver(self, forKeyPath: "contentSize", options: .new, context: &myContext)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if context == &myContext {
            print(webView.scrollView.contentSize.height)
        } else {
            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        }
    }
}

对我也没有帮助,因为我真的需要确保收到的值是最终高度。

很高兴知道:我无法控制网页,因此不能选择使用 javascript。

我希望有人能指出我正确的方向!

标签: iosswiftwkwebview

解决方案


因此,您无法控制网页,但 html dom 不会逐页更改。因此,您可以使用脚本来获取页面的高度。

也许这对您有帮助:

        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
            if complete != nil {
                webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
                    // Here is your height
                })
            }
        })
    }

PS:您也可以尝试“document.body.offsetHeight”而不是滚动高度。


推荐阅读