Получение окончательной визуализированной высоты статической страницы в WKWebView - PullRequest
0 голосов
/ 29 мая 2018

В моем приложении я использую 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 не вариант.

Я надеюсь, что кто-то может указать мне правильное направление!

1 Ответ

0 голосов
/ 29 мая 2018

Таким образом, у вас нет контроля над веб-страницами, но HTML-домен не меняется на странице на страницу.Таким образом, вы можете использовать скрипт, чтобы получить высоту вашей страницы.

Может быть, это поможет вам:

        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' вместо высоты прокруткитакже.

...