在UIWebView中实现滑动手势返回/前进?

8

我在我的应用中有一个WebView。

由于它是一个选项卡应用程序,我无法添加用于在网站上回退/前进的按钮。

我想通过滑动来回退/前进。从左侧/边缘向右滑动就是回退...就像iOS的Safari浏览器一样。

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

4个回答

17

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

12

使用 Swift 3 和 Swift 4 回答

如果任何人仍然遇到问题。这对我起作用:

查找 "didFinish",添加/替换以下代码。

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    self.didFinish()

    webView.allowsBackForwardNavigationGestures = true

}

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

webView.allowsBackForwardNavigationGestures = true


2
只是为了澄清,WKWebViewallowsBackForwardNavigationGestures属性,而UIWebView没有。 - user6553825

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

}

谢谢您的回答。这段代码应该放在ViewController.m文件中的[super viewDidLoad];下面吗? - user4428017
是的,你可以在viewDidLoad中添加这个。不用谢。如果有效,请务必接受答案:) - mKane
imageView是什么?我有一个WebView。[imageView addGestureRecognizer:swipeLeft]; - user4428017
我收到了“使用未声明的标识符'handleSwipe'”的错误。handleSwipe是什么?现在我该怎么办?ViewController.h中不需要任何代码吗?(我将“Swipe Gesture Recognizer”添加到了WebView中。这样做正确吗?) - user4428017
处理滑动操作是它调用的方法,您可以在其中为您的 Web 视图添加后退和前进操作,没错。 - mKane
请见下面我的“答案”! - user4428017

2
加布里埃尔·马德鲁加的回答对我有用。我进一步简化了代码行数: "最初的回答"。
  1. Drag and drop a WebView into the storyboard. Apply required constraints.
  2. Declare the IBOutlet of the WebView. I named it webViewBox.
  3. Import WebKit framework. (import WebKit)
  4. Add the following lines of code in 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
是的@htafoya,但这些手势现在已经普遍了。对于某人来说,意外执行这些手势并不容易。 - Suyog

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