我试过这个,这应该有效,但不是:
webView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
我正在使用浏览器,并且有几个webView保持在堆栈中。有些网站按预期工作,从顶部开始,有些则没有。
从顶部开始:http://leagueoflegends.com/
这个开始有点下降,必须手动向上滚动:http://euw.leagueoflegends.com/
额外注意,第一个webView永远不会发生这个问题。即使我加载第二个链接并将其显示为第一个webView,它也不会滚动到中间。
答案 0 :(得分:3)
旋转WKWebView时遇到了类似的问题。
旋转到横向后,视图会自动滚动到中间。
我使用以下解决方法在轮换后再次滚动到页面顶部:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: nil, completion: { (context) in
self.webKitView.evaluateJavaScript("window.scrollTo(0,0)", completionHandler: nil)
})
}
在您的情况下,您应该在加载网址后直接调用此方法。
webKitView.evaluateJavaScript("window.scrollTo(0,0)", completionHandler: nil)
或者如果在WKWebView中导航时出现问题,可以使用WKNavigationDelegate(我没有测试过这个):
override func viewDidLoad() {
super.viewDidLoad()
// load content of webKitView here and set as view or add as subview
webKitView.navigationDelegate = self
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webKitView.evaluateJavaScript("window.scrollTo(0,0)", completionHandler: nil)
}
答案 1 :(得分:2)
我们的应用程序使用多个WKWebView实例,我们也遇到了一些页面随机滚动到页面某个位置的问题。
我们能够通过在加载URL之前使用下一个将加载到窗口层次结构的下一页的webView来解决此问题。
WKWebView* nextWebView = [WKWebView new];
[[[UIApplication sharedApplication] keyWindow] addSubview:webView.view];
[[[UIApplication sharedApplication] keyWindow] sendSubviewToBack:webView.view];
然后当你加载你的网址时:
[nextWebView.view removeFromSuperview];
[controller.view addSubview: nextWebView.view];
答案 2 :(得分:0)
我会尝试使用javascript doc滚动到顶部:
NSString *script = @"window.scrollTo(0, 0)";
// UIWebView
// [webView stringByEvaluatingJavaScriptFromString:script];
// WKWebView
[webView evaluateJavaScript:script completionHandler:NULL];
答案 3 :(得分:0)
我也遇到了这个。最后,我用这种方式解决了这个问题:
if #available(iOS 11, *) {
webView.scrollView.contentInsetAdjustmentBehavior = .never
}
如果您在iOS 11上遇到此问题,请尝试此操作。
答案 4 :(得分:0)
在iOS 11.0之前,UIWebView可以使用委托来表示WebView的加载已完成,并且加载完成后我们可以执行任何操作。
现在,我们有了WKWebView,它在您的webView完成加载后不提供任何委托方法来进行通知。因此,如果我们执行以下代码,那么它将无法正常工作:
let myURL = URL(string: "https://www.google.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
webView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
在这种情况下,webView.load()是一个异步函数,该函数将被调用,并且代码将继续移动而无需等待其完成。因此,您对setContentOffset的调用可以工作,但是在webView完成加载之后,它将ContentOffset重置为默认值,该值实际上是(0,0),但是我不确定为什么您的WebView不会从顶部加载。但是,按照以下方式进行代码可能会对您有所帮助:
扩展到WKNavigationDelegate并在ViewController中实现didFinish导航方法,然后在该方法中调用setContentOffset。
class ViewController: UIViewController, WKNavigationDelegate {
override func viewDidLoad() {
let myURL = URL(string: "https://www.google.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
webView.navigationDelegate = self
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
}
答案 5 :(得分:0)
快捷键4
此函数是WKWebView的UIScrollView的一部分,并滚动到给定的矩形。
scrollRectToVisible(_ rect: CGRect, animated: Bool)
代码示例如下:
let rect: CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
webView.scrollView.scrollRectToVisible(rect, animated: true)
答案 6 :(得分:0)
如果要求WKWebView显示网页时WKWebView没有完全初始化或调整大小,似乎会发生这种情况。
就我而言,我在loadView
期间在UIViewController中创建了Web视图。如果随后我在viewDidLoad
期间请求导航到某个网页,则该网页视图会在页面的中部向下滚动。通过将html请求移至viewWillAppear:
(稍后在视图控制器生命周期中),我能够解决此问题。