Вы можете использовать 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
}
}
UITextView, вероятно, имеет свой собственный распознаватель жестов для обработки, когда пользователь нажимает на него. Когда это происходит, это делает текстовое представление первым респондентом, который заставляет клавиатуру появляться. Распознаватели жестов могут заставить другие распознаватели жестов потерпеть неудачу, когда они распознают свой жест. (См. документы ). Возможно, именно это и происходит, когда вы добавляете жест касания. Он распознает касание и таким образом заставляет другие жесты терпеть неудачу, что препятствует тому, чтобы текстовое представление стало первым респондентом.
Лучшее решение - следовать ответу на этот вопрос (как было упомянуто @FrancescoDeliro в комментариях) и использовать вызовы делегатов, чтобы знать, когда редактирование начинается / заканчивается.