Как обнаружить обратный удар в WkWebView - PullRequest
0 голосов
/ 06 сентября 2018

Можно ли обнаружить прокрутку назад в веб-представлении, если не было навигации вперед? Следующий код работает нормально, если пользователь переместился с первой страницы, но я хочу знать, прокрутили ли они назад, находясь на этой странице.

Обновление - это код, который я использую после изменения его в комментариях. Я добавил функцию навигации назад и жест смахивания.

    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)
    }
}

1 Ответ

0 голосов
/ 06 сентября 2018

Я бы реализовал 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, но я ожидаю, что вам понадобятся и другие.

...