【问题标题】:Swipe gesture for back/forward in UIWebView?在 UIWebView 中向后/向前滑动手势?
【发布时间】:2015-08-14 14:26:40
【问题描述】:

我的应用中有一个 WebView。

因为它是一个选项卡式应用程序,我无法在网站上添加返回/前进按钮。

我想通过滑动来后退/前进。从左侧/边缘向右滑动又回来了……就像在 iOS 的 Safari 浏览器中一样。

我该怎么做?我想我应该使用“屏幕边缘平移手势识别器”,对吧?

【问题讨论】:

    标签: ios objective-c uiwebview uiswipegesturerecognizer


    【解决方案1】:

    在 Swift 3 中接受的答案:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let swipeLeftRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(recognizer:)))
        let swipeRightRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(recognizer:)))
        swipeLeftRecognizer.direction = .left
        swipeRightRecognizer.direction = .right
    
        webView.addGestureRecognizer(swipeLeftRecognizer)
        webView.addGestureRecognizer(swipeRightRecognizer)
    }
    
    @objc private func handleSwipe(recognizer: UISwipeGestureRecognizer) {
        if (recognizer.direction == .left) {
            if webView.canGoForward {
                webView.goForward()
            }
        }
    
        if (recognizer.direction == .right) {
            if webView.canGoBack {
                webView.goBack()
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 Swift 3 和 Swift 4 中回答

      如果有人仍然有问题。这对我有用:

      找到“didFinish”添加/替换以下代码。

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

      您需要的主要代码只有一行。它位于 self.didFinish() 之后,但仍在 {} 括号内。

      webView.allowsBackForwardNavigationGestures = true

      【讨论】:

      • 澄清一下,WKWebView 具有 allowsBackForwardNavigationGestures 属性,而 UIWebView 没有。
      【解决方案3】:

      为什么不直接使用滑动手势识别器?

      UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
      UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
      
      // Setting the swipe direction.
      [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
      [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
      
      // Adding the swipe gesture on WebView
      [webView addGestureRecognizer:swipeLeft];
      [webView addGestureRecognizer:swipeRight];
      
      - (void)handleSwipe:(UISwipeGestureRecognizer *)swipe {
      
      if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
          NSLog(@"Left Swipe");
      }
      
      if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
          NSLog(@"Right Swipe");   
      } 
      
      }
      

      【讨论】:

      • 感谢您的回答。把这段代码放在哪里?在[超级viewDidLoad]下;在 ViewController.m 中?
      • 是的,您可以将其添加到您的 viewdidload 中。别客气。如果有效,请务必接受答案:)
      • [imageView addGestureRecognizer:swipeLeft];什么是图像视图?我有一个 WebView。
      • 我得到“使用未声明的标识符 'handleSwipe'”。什么是handleSwipe?我现在能做什么?不需要 ViewController.h 中的代码? (我在 WebView 中添加了“滑动手势识别器”。对吗?)
      • 句柄滑动是它调用的方法,您可以在其中为您的网络视图添加后退操作,是的,这是正确的
      【解决方案4】:

      Gabriel Madruga 的回答对我有用。我通过以下方式进一步减少了代码行数:

      1. 将 WebView 拖放到情节提要中。应用所需的约束。
      2. 声明 WebView 的 IBOutlet。我将它命名为 webViewBox。
      3. 导入 WebKit 框架。 (导入 WebKit)
      4. 在 viewDidLoad() 中添加以下代码

        let leftSwipe = UISwipeGestureRecognizer(target: webViewBox, action: #selector(webViewBox.goForward))
        leftSwipe.direction = .left
        webViewBox.addGestureRecognizer(leftSwipe)
        
        let rightSwipe = UISwipeGestureRecognizer(target: webViewBox, action: #selector(webViewBox.goBack))
        leftSwipe.direction = .right
        webViewBox.addGestureRecognizer(rightSwipe)
        

      您的最终结果应如下所示:

          import UIKit
          import WebKit
      
          class ViewController: UIViewController {
      
      
      @IBOutlet weak var webViewBox: WKWebView!
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
      
          //URL request:
          let urlReq = URLRequest(url: URL(string: "https://www.google.co.in")!)
          //Load the URL:        
          webViewBox.load(urlReq)
      
      
      
          //To go forward:
          let leftSwipe = UISwipeGestureRecognizer(target: webViewBox, action: #selector(webViewBox.goForward))
          leftSwipe.direction = .left
          webViewBox.addGestureRecognizer(leftSwipe)
      
          //To go back:
          let rightSwipe = UISwipeGestureRecognizer(target: webViewBox, action: #selector(webViewBox.goBack))
          rightSwipe.direction = .right
          webViewBox.addGestureRecognizer(rightSwipe)
        }
      }
      

      【讨论】:

      • 这有点敏感,用户可能会意外滑动
      • 是的@htafoya,但这些手势现在有点普遍。有人不小心这样做并不容易
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多