在后台/关闭屏幕中加载WKWebView

时间:2018-09-17 13:50:39

标签: ios swift wkwebview

是否可以在后台/屏幕外加载WKWebView,以便将加载隐藏在另一个视图后面?

1 个答案:

答案 0 :(得分:1)

您可以将 WKWebView添加到视图层次结构,但是其 x是您当前的宽度,因此它位于屏幕外部,但位于呈现层次结构之内。

WKNavigationDelegate 添加到您的课程中,然后像

一样将其添加到webView中
webView.navigationDelegate = self

然后实现以下功能:

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

该功能以及其他一些功能在网络视图完成内容加载时被调用,但其中不包括100%完成的呈现。之后,仍然需要一些渲染时间,此过程的时间消耗取决于所加载的内容。

当前没有100%完成加载和渲染的回调,因此,如果您知道这些文件,则可以在将webView移至可见区域之前计算或使用修复延迟。

OR

如果对此感到满意,则可以在Web视图中观察私有值,并在这些值更改为首选状态后移动Web视图。例如,如下所示:

class MyCustomWKWebView: WKWebView {

func setupWebView(link: String) {
    let url = NSURL(string: link)
    let request = NSURLRequest(url: url! as URL)
    load(request as URLRequest)
    addObserver(self, forKeyPath: "loading", options: .new, context: nil)
}

override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    guard let _ = object as? WKWebView else { return }
    guard let keyPath = keyPath else { return }
    guard let change = change else { return }

    switch keyPath {
    case "loading":
        if let val = change[NSKeyValueChangeKey.newKey] as? Bool {
            //do something!
        }
    default:
        break
    }
}

deinit {
    removeObserver(self, forKeyPath: "loading")
}
}