прерывистые пустые / частичные скриншоты WKWebView с использованием takeSnapshot - PullRequest
0 голосов
/ 31 марта 2019

Я делаю снимок экрана WKVebView в обработчике завершения оценки javascript:

func loadPage(){
    let fileURL = URL(fileURLWithPath: "...")
    let baseUrl = URL(fileURLWithPath: "...")
    webView?.navigationDelegate = self
    webView.loadFileURL(fileURL, allowingReadAccessTo: baseUrl)
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("....") { (result, error) in
        let configuration = WKSnapshotConfiguration()
        configuration.rect = CGRect(origin: .zero, size: (self.webView?.frame.size)!)
        self.webView!.takeSnapshot(with: configuration, completionHandler: { (image, error) in
            // do something with the image
        })
}

Даже если он находится в обработчике завершения функции webView.evaluateJavaScript, содержимое, если часто не завершенодля рендеринга, и я получаю либо пустой скриншот, либо частичные (присутствуют только некоторые элементы).

Как я могу убедиться, что рендеринг завершен, прежде чем делать скриншот (я не хочу вводить фиксированную задержку)

1 Ответ

2 голосов
/ 31 марта 2019

Поскольку содержимое WebView больше размера экрана, поэтому сначала мы получим высоту и ширину содержимого, а затем сделаем снимок экрана

  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    // Will get Height and Width of the Content

    self.webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
        if complete != nil {
            self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
                guard let contentHeight = height as? CGFloat else { print("Content height could not be obtained"); return }
                self.webView.evaluateJavaScript("document.body.scrollWidth", completionHandler: { [weak self](width, error) in
                    let contentWidth = width as! CGFloat
                    let rect = CGRect(x: 0, y: 0, width: contentWidth, height: contentHeight)
                    self?.takeScreenshot(rect)
                })
            })
        }
    })

}

Как только мы получим Высота и Ширина, мы вызовем метод ниже, чтобы сделать снимок экрана

func takeScreenshot(_ rect: CGRect) {
    webView.evaluateJavaScript(".....") { (result, error) in
        let configuration = WKSnapshotConfiguration()
        configuration.rect = rect//CGRect(origin: .zero, size: (self.webView?.frame.size)!)
        self.webView!.takeSnapshot(with: configuration, completionHandler: { (image, error) in
            // do something with the image
            print("image:\(image!)")
        })
    }
}

Надеюсь, это поможет вам.

...