我有一个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/

10-12 00:30
查看更多