Перенаправлять касания, отличные от двойного касания, к UITextView

У меня есть UITextView, кроме того, у меня есть несколько UIView. Любое сенсорное действие на UIView может быть связано с соответствующим IBAction. В моем сценарии жест двойного касания должен быть связан с IBAction UIView, любое другое прикосновение, кроме этого, должно быть перенаправлено на базовый UITextView.

Мой блок кода для выполнения вышеуказанного сценария

UITextView *textView = [[UITextView alloc] init];

UIView *subview = [[UIView alloc] init];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
doubleTap.numberOfTapsRequired = 2;
[subview addGestureRecognizer:doubleTap];

[textView addSubview: subview];

Я пробовал следующие решения SO,

Как игнорировать сенсорные события и передать их объектам UIControl другого подпредставления?

используя hitTest, я не могу зафиксировать жест двойного нажатия в UIViews, который присутствует поверх UITextView

Настройте UIGestureRecognizer для приема касаний, запущенных в подвидах

пересылка UITouch, установленная с touchBegan:withEvent: в UIView на UITextView, не дает ожидаемого поведения по умолчанию UITextView

Существуют ли какие-либо другие решения для решения этого сценария?

Заранее спасибо.


person The Debugger    schedule 27.12.2012    source источник


Ответы (2)


Это может быть достигнуто за счет:

  1. Разрешение UITextView обрабатывать сенсорные события, как это предлагается в Как игнорировать сенсорные события и передавать их объектам UIControl другого подпредставления?
  2. В hitTest UIView сохраните ссылку на представление, в котором оно произошло, чтобы его можно было использовать позже.
  3. Добавьте пользовательский распознаватель жестов двойного касания, который проверяет, не является ли ссылка hitTest нулевой, указывая, что двойное касание произошло в целевом представлении, и перенаправляет событие в это представление. Если нет, сбой распознавателя жестов. Чтобы не сработать распознаватель жестов, вам нужно включить UIKit/UIGestureRecognizerSubclass.h и установить для свойства состояния значение UIGestureRecognizerStateFailed.
  4. Добавьте распознаватель жестов в UITextView.
  5. Расширьте UITextView, чтобы переопределить метод полученияgestRecognizers и выполнить цикл по распознавателям жестов, чтобы потребовать, чтобы пользовательский жест не прошел. Это должно быть сделано в геттере, так как распознаватели жестов часто сбрасываются.
person Krishna    schedule 01.03.2013

Подвид не нужен, удалите его и замените:

[subview addGestureRecognizer:doubleTap];

С УЧАСТИЕМ:

[textView addGestureRecognizer:doubleTap];

Теперь вы должны получить свое событие в методе tapDetected:.

Чтобы убедиться, что вы не меняете поведение UITextView, используйте следующие методы:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

OR

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
person Niralp    schedule 19.01.2013