В iOS, как запретить распознавание жестов на панели инструментов? - PullRequest
1 голос
/ 10 мая 2011

В моем представлении есть панель инструментов с двумя кнопками типа UIBarButtonItem. Я пытаюсь реализовать распознаватель жестов таким образом, чтобы при нажатии в любом месте представления, кроме панели инструментов, я вызывал селектор. Нажатие на элемент кнопки панели на панели инструментов должно вызвать метод действия этой кнопки. Представление соответствует протоколу UIGestureRecognizerDelegate и реализует метод shouldReceiveTouch следующим образом:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
                                                shouldReceiveTouch:(UITouch *) touch {
  // Disallow recognition of tap gestures in the toolbar
  if ((touch.view == self.sideOneBarButton.customView) &&
      (gestureRecognizer == self.tapRecognizer)) {
    return NO;
  }
  return YES;
}

Проблема в том, что когда я нажимаю на кнопку на панели инструментов, touch.view имеет тип UTToolbarTextButton*, который является недокументированным классом, поэтому мой оператор if не выполняется, и shouldReceiveTouch всегда возвращает YES, а событие кнопки никогда не вызывается .

В идеале я хотел бы сказать: если касание находится где-нибудь на панели инструментов, тогда верните нет. Какой лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 30 октября 2014

О функции делегата, это хорошо для меня.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view.superview isKindOfClass:[UIToolbar class]]) {
        return NO;
    }
    return YES;
}
0 голосов
/ 30 июля 2014

Есть способ игнорировать жест на чем-то, что не является вашим центральным взглядом.

Например, у меня есть:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];

tap.delegate = self;

[self.view addGestureRecognizer:tap];

Добавить делегат жестов в класс:

@interface myClass : UIViewController<..,UIGestureRecognizerDelegate,..>

и теперь функция делегата:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view == self.view)
    {
        return YES;
    }
    return  NO;
}

Это сработало для меня, когда я не мог использовать UIToolbar из-за жеста

Также, как упомянул @LandedGently, здесь есть дополнительная информация:

Кнопка UIB внутри представления с UITapGestureRecognizer

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

...