使用下面的代码,我试图将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
,导致出现完全相同的问题
答案 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视图确实已完成加载,但滚动视图尚未完成加载。
我的解决方法如下:
WKWebViewNavigationDelegate
和UIScrollViewDelegate
协议class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate {
//..
}
var position: CGPoint?
var webViewFinished = false
didFinish
委托方法中,将position
的值设置为滚动视图的内容偏移,并将webViewFinished
设置为true
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
position = myWebView.scrollView.contentOffset
webViewFinished = true
}
scrollViewDidScroll
委托方法中,检查Web视图是否已完成加载。如果有,请将“滚动视图”的内容偏移设置为position
的值,并将webViewFinished
设置为false
(否则,此代码将在用户每次滚动时运行)。别忘了在position
上进行可选链接!func scrollViewDidScroll(_ scrollView: UIScrollView) {
if webViewFinished {
webViewFinished = false
if let p = position {
web.scrollView.setContentOffset(p, animated: false)
}
}
}
override func viewDidLoad(){
super.viewDidLoad()
myWebView.navigationDelegate = self
myWebView.scrollView.delegate = self
}