UIGestureRecognizer UITextView предотвращает появление клавиатуры при нажатии - PullRequest
0 голосов
/ 19 января 2019

У меня есть 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, я вижу сообщение выше, напечатанное на консоли. Однако клавиатура больше не появляется.

Мне показалось, что документ Apple запутался: Здесь , это говорит о том, что

Распознаватель жестов не участвует в ответчике представления цепь.

, который я интерпретирую как любые жесты, которые также отправляются на представление и вверх по цепочке, как обычно.

Позже на той же странице написано,

Если распознаватель жестов распознает его жест, оставшиеся касания для просмотра отменяются.

, что означает, что если подключенный распознаватель жестов способен понимать жест как тот, который он должен распознать, то он предотвратит его доставку в представление, к которому он прикреплен. Кроме того, он указывает 3 свойства, которые должны быть в состоянии остановить распознаватель жестов от этого. Я установил для всех трех из них значение false в моем коде, как показано выше.

Что на самом деле происходит здесь и как я могу позволить UITextView нормально интерпретировать прикосновения, а также иметь возможность использовать распознаватель жестов?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете использовать 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
    }

}
0 голосов
/ 20 января 2019

UITextView, вероятно, имеет свой собственный распознаватель жестов для обработки, когда пользователь нажимает на него.Когда это происходит, это делает текстовое представление первым респондентом, который заставляет клавиатуру появляться.Распознаватели жестов могут заставить другие распознаватели жестов потерпеть неудачу, когда они распознают свой жест.(См. документы ). Возможно, именно это и происходит, когда вы добавляете жест касания.Он распознает касание и, таким образом, заставляет другие жесты терпеть неудачу, что препятствует тому, чтобы представление текста стало первым респондентом.

Лучшее решение состоит в том, чтобы следовать ответу на этот вопрос (как уже упоминалось@FrancescoDeliro в комментариях) и используйте вызовы делегатов, чтобы знать, когда редактирование начинается / заканчивается.

...