通过UIWebView进行双击识别 - Swift 3

时间:2017-03-02 08:32:46

标签: ios uiwebview swift3 uigesturerecognizer

我正在尝试通过UIWebView实现Gesture识别器来检测双击。但没有人承认。

我已经浏览过网页上的一些教程,我可以编译到这个。代码如下。但没有成功。

class PageContentViewController: UIViewController, UIGestureRecognizerDelegate, UIWebViewDelegate  {

@IBOutlet weak var webView: UIWebView!

var pageIndex: Int = 0
var strTitle: String!
var flag : Int = 0

override func viewDidLoad() {
    super.viewDidLoad()
    webView.delegate = self

    DispatchQueue.main.async {
    let req = URLRequest(url: URL(fileURLWithPath: Bundle.main.path(forResource: self.strTitle+"/index" , ofType: "html")!))
    self.webView.loadRequest(req)
    self.view.addSubview(self.webView)

    }

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(self.goToback))
    tapGestureRecognizer.delegate? = self
    tapGestureRecognizer.numberOfTapsRequired = 2
    webView.isUserInteractionEnabled = true
    webView.addGestureRecognizer(tapGestureRecognizer)
    webView.scrollView.addGestureRecognizer(tapGestureRecognizer)
    webView.gestureRecognizerShouldBegin(tapGestureRecognizer)
}


func gestureRecognizer(_: UIGestureRecognizer,  shouldRecognizeSimultaneouslyWith:UIGestureRecognizer) -> Bool {
    return true
}
func gestureRecognizer(_: UIGestureRecognizer, shouldReceive:UITouch) -> Bool {
    return true
}


func goToback(){
    print("On the Back")
}

}

This picture contains webview in orange Attribute Inspector for UIWebView

代码有什么问题。?

我很快乐。

提前致谢

4 个答案:

答案 0 :(得分:2)

我认为你需要添加

webView.delegate = self

还要将UIWebViewDelegate添加到您的班级

编辑:

你的shouldRecognizeSimultaneouslyWith和shouldReceive看起来有点奇怪可能是一个复制粘贴错误?它应该看起来像:

func gestureRecognizer(_: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith:UIGestureRecognizer) -> Bool {
    return true
}
func gestureRecognizer(_: UIGestureRecognizer, shouldReceive:UITouch) -> Bool {
    return true
}

编辑2:

我复制了您的确切代码并删除了gestureRecognizerS应该开始并且它有效,我也能够删除其他一些代码,不确定您是否在项目中需要它但是这对我有用:

class ViewController: UIViewController, UIGestureRecognizerDelegate, UIWebViewDelegate  {

@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    webView.delegate = self

    DispatchQueue.main.async {
        let req = URLRequest(url: URL(fileURLWithPath: Bundle.main.path(forResource: self.strTitle+"/index" , ofType: "html")!))
        self.webView.loadRequest(req)
    }

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(self.goToback))
    tapGestureRecognizer.delegate = self
    tapGestureRecognizer.numberOfTapsRequired = 2
    webView.isUserInteractionEnabled = true
    webView.addGestureRecognizer(tapGestureRecognizer)
}


func gestureRecognizer(_: UIGestureRecognizer,  shouldRecognizeSimultaneouslyWith:UIGestureRecognizer) -> Bool {
    return true
}


func goToback() {
    print("On the Back")
}

答案 1 :(得分:1)

为什么对UIGestureRecognizerwebview使用相同的手势webview.scrollview

相反,您需要为这两者创建两个单独的UIGestureRecognizer ...

// for webView
let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(self.goToback))
tapGestureRecognizer.delegate? = self
tapGestureRecognizer.numberOfTapsRequired = 2
webView.isUserInteractionEnabled = true
webView.addGestureRecognizer(tapGestureRecognizer)

// for webView.scrollView
let tapGestureRecognizer1 = UITapGestureRecognizer(target:self, action:#selector(self.goToback))
tapGestureRecognizer1.delegate? = self
tapGestureRecognizer1.numberOfTapsRequired = 2
 webView.scrollView.addGestureRecognizer(tapGestureRecognizer1)

如果您为两个对象分配了相同的手势识别器,则其中一个对象没有它...请参阅日志

enter image description here

答案 2 :(得分:0)

通过执行以下操作,我在我的应用中进行了双击手势:

我创建了一个UIWebView的子类,即UIGestureRecognizerDelegate

class MyWebView: UIWebView, UIGestureRecognizerDelegate {
    func gestureRecognizer(_: UIGestureRecognizer,  shouldRecognizeSimultaneouslyWith:UIGestureRecognizer) -> Bool {
        return true
    }

    func gestureRecognizer(_: UIGestureRecognizer, shouldReceive:UITouch) -> Bool {
        return true
    }
}

然后在我的View Controller类中,我引用了我的子类(确保它也在Interface Builder中引用)

@IBOutlet weak var webView: MyWebView!

在viewDidLoad中添加识别器

 let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(self.goToback))
tapGestureRecognizer.delegate? = self.webView //set the delegate to the custom UIWebView
tapGestureRecognizer.numberOfTapsRequired = 2
webView.isUserInteractionEnabled = true
webView.addGestureRecognizer(tapGestureRecognizer)

希望这有帮助,我原来的代码是在Objective-C代码中,所以不得不在这里快速翻译,所以希望没有语法问题。

答案 3 :(得分:0)

我已经使用过这段代码,它对我来说完美无缺

override func viewDidLoad() {
    super.viewDidLoad()

    let tapLockGesture = UITapGestureRecognizer(target: self, action: #selector(tapLock))    
    tapLockGesture.delegate = self
    tapLockGesture.numberOfTapsRequired = 2
    webView.addGestureRecognizer(tapLockGesture)

}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

确保您符合 UIGestureRecognizerDelegate UIScrollViewDelegate