UITapGestureRecognizer поглощает все жесты

Я пытаюсь добавить UITapGestureRecognizer в свое приложение, чтобы я мог обнаруживать и реагировать на все два касания пальца, но передавать любой другой пользовательский ввод. Звучит тривиально, но я просто не могу заставить его работать. Вот мой код внутри моего контроллера основного представления:

- (void) viewDidLoad {
  // other init stuff
  UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  [tapRecognizer setNumberOfTouchesRequired:2];
  [tapRecognizer setNumberOfTapsRequired:1];
  [tapRecognizer setCancelsTouchesInView:NO];

  UIView *tapHolderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
  [tapHolderView setMultipleTouchEnabled:YES];
  [tapHolderView addGestureRecognizer:tapRecognizer];

  [self.view addSubview:tapHolderView];

  [tapRecognizer release];
}

- (void) handleTap:(UITapGestureRecognizer *) sender {
  if (sender.state == UIGestureRecognizerStateEnded) {
    // do something
  }
}

Происходит следующее: нажатие двумя пальцами вызывает метод handleTap. Любой другой пользовательский ввод, будь то смахивание, сжатие, касание одним пальцем и т. д., не будет воспринят каким-либо другим представлением (среди прочего, UIToolbar, UIWebView).

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


person thomax    schedule 07.06.2012    source источник


Ответы (3)


Попробуйте установить контроллер представления в качестве делегата UIGestureRecognizerDelegate и реализовать жестRecognizer:shouldRecognizeSimulaneouslyWithGestureRecgonizer, чтобы он всегда возвращал «ДА». Пример:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
person Christian    schedule 07.06.2012
comment
Спасибо за помощь. Я то, что вы предлагаете, все тот же результат. Я также добавил оператор журнала в метод shouldRecognizeSimultaneousWithGestureRecognizer, и, похоже, он никогда не вызывается. Может это ключ к решению моей проблемы? - person thomax; 07.06.2012
comment
А! Мне не нужен shouldRecognizeSimultaneousWithGestureRecognizer, но я добавил UITapGestureRecognizer в свое представление, а не в новое представление, которое я добавил в качестве подпредставления, а затем прикосновения прошли, как и ожидалось! Спасибо! - person thomax; 08.06.2012

Единственное, о чем я могу думать, это использование:

 [tapRecognizer setDelegate:self];

Вы определили какие-либо методы делегата для вашего распознавателя жестов в вашем контроллере представления? не могли бы вы попробовать прокомментировать эту строку для быстрого теста?

person sergio    schedule 07.06.2012
comment
Спасибо за попытку помочь! Если я закомментирую эту строку, метод handleTap не будет вызываться, и никакие жесты не будут обнаружены ни в одном представлении. - person thomax; 07.06.2012
comment
интересно... установка делегата не требуется для работы распознавателя жестов. Вы определили какие-либо методы делегата? есть ли другой распознаватель жестов, который может повлиять на первый? - person sergio; 07.06.2012
comment
О, извини, мой плохой. Когда я закомментирую [tapRecognizer setDelegate:self], я получаю тот же результат: handleTap вызывается при касании двумя пальцами, но никакие другие жесты не передаются другим представлениям. Обновил вопрос, удалив эту строку. Спасибо! - person thomax; 07.06.2012

Мы реализовали жесты одинарного и двойного касания в одном и том же представлении. Надеюсь это поможет

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] 
                                     initWithTarget:self 
                                     action:@selector(handleSingleTapOnMainImageView:)];

[self addGestureRecognizer:singleTap];
[singleTap release];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] 
                                     initWithTarget:self 
                                     action:@selector(handleDoubleTapOnMainImageView:)];
[doubleTap setNumberOfTapsRequired:2];
[singleTap requireGestureRecognizerToFail:doubleTap];
[self addGestureRecognizer:doubleTap];
[doubleTap release];
person Warif Akhand Rishi    schedule 07.06.2012
comment
Это рабочий код? Вы получаете доступ к singleTap после того, как он был выпущен, верно? - person thomax; 07.06.2012
comment
Это рабочий код. alloc должен быть освобожден. Да, я получаю доступ к singleTap после его выпуска. Но перед релизом я добавил жест на свой вид. хорошего дня... - person Warif Akhand Rishi; 08.06.2012
comment
Это работает, потому что self сохранил singleTap, поэтому он не был освобожден. Это по-прежнему очень плохой стиль, и в мире без ARC оба распознавателя жестов должны быть выпущены в конце этого блока кода. - person Steve Madsen; 27.06.2012