2

По какой-то причине мой UITapGestureRecognizer не вызывает метод, когда я нажимаю UIButton. Что действительно странно, так это то, что я использовал точки останова в Xcode, чтобы убедиться, что метод gestureRecognizer:shouldReceiveTouch: возвращает ДА. Жест должен называть его методом, но это не так. У меня cancelsTouchesInView установлен на YES, но он ничего не делает.UITapGestureRecognizer не вызывает метод целевого действия

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isKindOfClass: [UIButton class]] && !editingTaskName) 
     return NO; 
    else if ([touch.view isKindOfClass: [UITextField class]]) 
     return NO; 

    return YES; // handle the touch 
} 

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

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(longPress:)]; 
[longPress setMinimumPressDuration: 0.3]; 
[longPress setDelaysTouchesBegan: YES]; 

[self setLongPressGesture: longPress]; 
[[self tableView] addGestureRecognizer: longPress]; 

UITapGestureRecognizer *backToTableView = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(backTapRecognized:)]; 
[backToTableView setCancelsTouchesInView: YES]; 
[backToTableView setDelegate: self]; 
[backToTableView setEnabled: NO]; 

[self setBackTapGesture: backToTableView]; 
[[self tableView] addGestureRecognizer: backToTableView]; 

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(hideShowEditing:)]; 
[tap setCancelsTouchesInView: YES]; 
[tap setDelegate: self]; 

[self setEditTap: tap]; 
[[self tableView] addGestureRecognizer: tap]; 

ответ

1

Кнопка имеет свою способность к обращению, поэтому между кнопкой и распознающим жестом есть конфликт. В iOS 6 выигрывает кнопка; распознаватель жеста, таким образом, не может распознать.

В iOS 6 существует метод UIView gestureRecognizerShouldBegin:. UIButton возвращает NO (это встроенный), так что это результат конфликта.

Это занимает еще более высокий приоритет, чем ваш gestureRecognizer:shouldReceiveTouch:.

+0

Так что, если я хотел, чтобы остановить UIButton от того приоритета, я бы подкласс UIButton и переопределить '' gestureRecognizerShouldBegin: метод. – bbraunj

+0

Было бы проще подключить распознаватель жестов к самой кнопке. Тогда этот распознаватель жестов будет побеждать. Однако этот вид убивает собственный кран кнопки; почему бы не просто использовать встроенное сообщение о действии кнопки и позволить кнопке работать так, как она хочет? – matt

-2

Попробуйте установить свойство numberOfTapsRequired вашего UITapGestureRecognizer. Что-то вроде этого должно хватить:

tap.numberOfTapsRequired = 1; 

Макс