swift - 使用 takeSnapshot 的 WKWebView 间歇性空白/部分屏幕截图

标签 swift macos cocoa screenshot wkwebview

我在 javascript 评估的完成处理程序中截取 WKVebView 的屏幕截图:

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 函数的完成处理程序中,如果内容经常没有完成渲染,我得到的要么是空白截图,要么是部分截图(只有一些元素存在) .

如何在截屏前确保渲染完成(我不想引入固定延迟)

最佳答案

由于 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!)")
        })
    }
}

希望对你有所帮助。

关于swift - 使用 takeSnapshot 的 WKWebView 间歇性空白/部分屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55440011/

相关文章:

ios - 显示和弹出多个 View Controller

ios - fatal error : unexpectedly found nil while unwrapping an Optional value while retrieving default

macos - 错误 ITMS-90283 : Invalid Provisioning Profile. bundle 中包含的配置文件无效 [缺少代码签名证书]

objective-c - 无法停止一次性通知?

ios - 每日同时推送通知,持续 10 天

json - 完美的JSON结构

python - 如何在 mac 上将 openalpr 与 python 绑定(bind)?

macos - NSSharingService 在默认电子邮件 MAC OSX 应用程序中设置抄送和密件抄送收件人

cocoa - MacOS/appkit NSPrint 逻辑用于打印长而复杂的报告

iphone - 处理变量分配和异步请求