如何在WkWebView中检测后退手势?

3

在没有进行前向导航的情况下,是否可能检测到Web视图中的后滑?如果用户已经移动到第一个页面之外,则以下代码可以正常工作,但我想知道他们是否在该页面上进行了后滑。

更新-这是我根据评论修改后使用的代码。我添加了后退导航功能和滑动手势。

    class WebViewClient: UIViewController, WKUIDelegate, WKNavigationDelegate, UIGestureRecognizerDelegate
{
    var webView: WKWebView!


    public func load(pageLink page: String)
    {
        print("Opening: " + page)

        if webView != nil
        {
            if let myURL = URL(string:page)
            {
                webUrlRequest = page

                let myRequest = URLRequest(url: myURL)

                webView.load(myRequest)
             }
      }

   func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
    {
        print("Opened: " + webUrlRequest)
    }

    override func loadView()
    {
        let pref = WKPreferences()
        pref.javaScriptEnabled = true

        let config = WKWebViewConfiguration()
        config.preferences = pref


        webView = WKWebView(frame: .zero, configuration: config)

        webView.uiDelegate = self
        webView.navigationDelegate = self

        webView.allowsBackForwardNavigationGestures = true


        view = webView
    }

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
    {
        if navigationAction.navigationType == .backForward && webView.backForwardList.backList.count == 0
        {
           print("Can't go back any more")
        }

        decisionHandler(.allow)
    }

    @objc func backNavigationFunction(_ sender: UIScreenEdgePanGestureRecognizer)
    {
        let dX = sender.translation(in: view).x
        if sender.state == .ended
        {
            let fraction = abs(dX / view.bounds.width)
            if fraction >= 0.35
            {
                print("Back swipe")
                //back navigation code here
            }
        }
    }

    override func viewDidLoad()
    {
        super.viewDidLoad()


        let swipeGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(backNavigationFunction(_:)))
        swipeGesture.edges = .left
        swipeGesture.delegate = self

        webView.addGestureRecognizer(swipeGesture)
    }
}

你实现过任何类型的手势识别器吗? - binaryPilot84
不,只需要上面的导航功能。 - glez
1个回答

6
我会实现一个UIScreenEdgePanGestureRecognizer来解决这个问题。请在您的viewDidLoad中添加以下内容。
let swipeGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(backNavigationFunction(_:)))
    swipeGesture.edges = .left
    swipeGesture.delegate = self
    view.addGestureRecognizer(swipeGesture)

然后,实现一个处理 backNavigationFunction 的函数,代码如下:
@objc func backNavigationFunction(_ sender: UIScreenEdgePanGestureRecognizer) {
    let dX = sender.translation(in: view).x
    if sender.state == .ended {
        let fraction = abs(dX / view.bounds.width)
        if fraction >= 0.35 {
            //back navigation code here
        }
    }
}

不要忘记使ViewController继承UIGestureRecognizerDelegate类(即class WebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, UIGestureRecognizerDelegate)。这里的代理是UIGestureRecognizerDelegate,但我预计您也需要其他代理。


谢谢你的帮助。所以它已经实现了,但是backNavigationFunction从未被触发。有什么想法可以检查吗? - glez
我把它添加到了主要问题中。 - glez
1
给你一些想法。如果你在模拟器上做这个,检测手势可能会很棘手。如果你还没有尝试过,请在设备上尝试。边缘手势必须几乎在屏幕边缘。你在backNavigationFunction中设置了断点吗?我很想知道它是否触发了。分数正在寻找屏幕的35%或更多被划过。你划了多少? - binaryPilot84
我正在最近的iPad上运行它,并在任何计算之前在nav函数中设置了断点。 - glez
相同的断点位置和目标是iOS 10。我也尝试将代码放在MainActivity中,而不是WebViewClient类中,结果相同。我会再仔细看看发生了什么,以确保我没有打错任何东西。 - glez
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接