Докосвания напред, различни от двойно докосване до 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 обекти на друг subview?
  2. В hitTest на UIView запазете препратката към изгледа, в който се е появила, за да може да се използва по-късно
  3. Добавете персонализирано разпознаване на жестове с двойно докосване, което проверява дали препратката на hitTest не е нула, което показва, че двойното докосване се е случило в целевия изглед и препраща събитието към този изглед. Ако не, откажете разпознаването на жестове. За да откажете разпознаването на жестове, трябва да включите UIKit/UIGestureRecognizerSubclass.h и да зададете свойството състояние на UIGestureRecognizerStateFailed
  4. Добавете разпознавателя на жестове към UITextView
  5. Разширете UITextView, за да замените инструмента за получаване на gestureRecognizers и преминете през разпознавателите на жестове, за да изисквате персонализираният жест да се провали. Това трябва да се направи в гетъра, тъй като изглежда, че разпознавателите на жестове често се нулират
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