我正在尝试通过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")
}
}
代码有什么问题。?
我很快乐。
提前致谢
答案 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)
为什么对UIGestureRecognizer
和webview
使用相同的手势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)
如果您为两个对象分配了相同的手势识别器,则其中一个对象没有它...请参阅日志
答案 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 。