我有一个UITextView,我在上面附加了一个手势识别器,如下所示:
let testTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(textTextViewTapped(gestureRecognizer:)))
testTapGestureRecognizer.cancelsTouchesInView = false
testTapGestureRecognizer.delaysTouchesBegan = false
testTapGestureRecognizer.delaysTouchesEnded = false
if textTextView != nil {
textTextView!.addGestureRecognizer(testTapGestureRecognizer)
}
上述选择器如下:
@objc func textTextViewTapped(gestureRecognizer: UIGestureRecognizer) {
print("testTextViewTapped called.")
}
每次我点击UITextView,我都能在控制台上看到上面的消息。但是,键盘不再出现。
我发现苹果的医生很困惑:
Here,上面说
手势识别器不参与视图的响应程序
链子。
我的解释是,任何手势都会被发送到视图和链上,这是正常的。
后来在同一页上说,
如果一个手势识别器识别出它的手势,剩下的触摸
因为视图被取消了。
这意味着,如果附加的手势识别器能够将一个手势理解为它应该识别的手势,那么它将阻止它被传递到它所附加的视图。此外,它还指定了3个属性,这些属性应该能够阻止手势识别器执行此操作。如上图所示,我已经在代码中将这三个设置为false。
这里到底发生了什么,我如何让UITextView正常地解释触摸,并能够使用手势识别器?
最佳答案
您可以使用UIGestureRecognizerDelegate
使UITapGestureRecognizer
按照正常的UITextView
行为工作:
class TestViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
tapGestureRecognizer.delegate = self
textView.addGestureRecognizer(tapGestureRecognizer)
}
@objc private func tap() {
print("tap")
}
}
extension TestViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
关于ios - UITextView的UIGestureRecognizer防止在点击时出现键盘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54269279/