在WKWebView中使用scrollIntoVIew跳到页面顶部

时间:2019-06-26 16:36:56

标签: javascript ios swift webkit wkwebview

使用下面的代码,我试图将HTML加载到WKWebview中,然后将其滚动到特定元素。

  let url = Bundle.main.url(forResource: "TestHTML", withExtension: "html")!
    myWebView.loadFileURL(url, allowingReadAccessTo: url)
    myWebView.evaluateJavaScript("document.getElementById('4').scrollIntoView(true);") {[weak self] (result, error) in
        print("result: \(result)")
        print (error)
    }

但是,当我运行它时,页面会加载,滚动到该部分,然后又跳回到页面顶部。

我还尝试设置contentOffset中的scrollView,导致出现完全相同的问题

2 个答案:

答案 0 :(得分:0)

您应该在webview委托方法 didFinish导航

中编写javascript评估代码
extension WebViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Finished navigating to url \(webView.url)")
        webView.evaluateJavaScript("document.getElementById('4').scrollIntoView(true);") { (any, error) in
            dump(error)
            print(any)
        }
    }
}

别忘了设置webview delgate

myWebView.navigationDelegate = self

答案 1 :(得分:0)

几个月前,我发布了这个问题,虽然this answer在一个演示项目中工作,但在另一个项目中对我不起作用-它会转到偏移量,然后回到顶部

问题似乎是,当webView(didFinish)中的代码运行时,Web视图确实已完成加载,但滚动视图尚未完成加载。

我的解决方法如下:

  1. 使ViewController符合WKWebViewNavigationDelegateUIScrollViewDelegate协议
class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate {
//..
}
  1. 向ViewController添加两个属性。一个将是CGPoint,用于存储滚动视图的内容偏移量,另一个将是一个布尔值,用于跟踪Web视图是否已完成加载,并且其值为false。
var position: CGPoint?
var webViewFinished = false
  1. didFinish委托方法中,将position的值设置为滚动视图的内容偏移,并将webViewFinished设置为true
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        position = myWebView.scrollView.contentOffset
        webViewFinished = true
    }
  1. scrollViewDidScroll委托方法中,检查Web视图是否已完成加载。如果有,请将“滚动视图”的内容偏移设置为position的值,并将webViewFinished设置为false(否则,此代码将在用户每次滚动时运行)。别忘了在position上进行可选链接!
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if webViewFinished {
            webViewFinished = false
            if let p = position {
                web.scrollView.setContentOffset(p, animated: false)
            }
        }
    }
  1. 最后但并非最不重要的是,设置Web视图/滚动视图的委托
override func viewDidLoad(){
    super.viewDidLoad()
    myWebView.navigationDelegate = self
    myWebView.scrollView.delegate = self
}