使用swift以编程方式滚动到webview的底部

时间:2017-02-06 05:21:36

标签: ios swift xcode webview uiwebview

我有以下网页浏览:

@IBOutlet weak var webView_MyContent: UIWebView!

并加载自定义html内容,如下所示:

self.webView_MyContent.loadHTMLString(html, baseURL: nil)

我想在我的内容加载时以编程方式滚动到页面的最底部。如何在swift中实现这一目标?

2 个答案:

答案 0 :(得分:5)

您可以使用UIWebView的{​​{3}}属性。

func webViewDidFinishLoad(_ webView: UIWebView) {

    let scrollPoint = CGPoint(x: 0, y: webView.scrollView.contentSize.height - webView.frame.size.height)
    webView.scrollView.setContentOffset(scrollPoint, animated: true)//Set false if you doesn't want animation
}

注意:请勿忘记设置delegate的{​​{1}}。

答案 1 :(得分:0)

使用Swift 4 / WKWebView不适用于我。

相反,我找到了方法webView.scrollToEndOfDocument()

要在加载完成后向下滚动,可以将其放入此功能:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.scrollToEndOfDocument(self)
}

别忘了导入WebKit并使类成为WebView的委托:

// ...
import WebKit
// ...

class ViewController: NSViewController, WKNavigationDelegate {
    // ...

高级:完成AJAX请求后向下滚动

现在我想向下滚动使用无限滚动的页面(当快到页面末尾时,它开始加载其他内容)。

这可以通过注入JavaScript并覆盖XMLHttpRequest方法来完成:

override func viewDidLoad() {
    super.viewDidLoad()

    // ...

    String javascript = String(contentsOfFile: Bundle.main.path(forResource: "script", ofType: "js"))
    webView.configuration.userContentController.add(self, name: "injectionHandler")
    webView.configuration.userContentController.addUserScript(WKUserScript.init(source: javascript, injectionTime: .atDocumentEnd, forMainFrameOnly: false))

    // ...

}

在Xcode项目的文件script.js中,您需要输入以下内容:

var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
    this.addEventListener("load", function() {
        var message = {"status": this.status, "requestUrl": url, "response": this.responseText, "responseURL": this.responseURL};
        webkit.messageHandlers.injectionHandler.postMessage(message);
    });
    open.apply(this, arguments);
};

要处理此事件(并且如果您还想捕获AJAX响应),则必须添加以下方法:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "injectionHandler", let dict = message.body as? Dictionary<String, AnyObject>, let status = dict["status"] as? Int, let response = dict["response"] as? String {
        if status == 200 {
            webView.scrollToEndOfDocument()
        }
    }
}

并使您的类扩展WKScriptMessageHandler:

class ViewController: NSViewController, WKNavigationDelegate, WKScriptMessageHandler {
    // ...