Один альтернативный подход, так как вы используете UIButton
s будет использовать addTarget:action:forControlEvents:
на ваших кнопках для событий:
UIControlEventTouchDragInside
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchDragExit
и выполняйте обработку в указанном вами методе action
.
Не должно быть трудным «отобразить» ветви в вашем методе обработки жестов на различные методы (или только один метод, если вам нравится) внутри вашего класса.
Я понимаю, что это не совсем удовлетворительный ответ, так как он отказывается от использования распознавателей жестов (и их средств), но он может работать для вас.
Что касается того, почему распознаватель жестов не работает правильно при применении к UITableViewCell
(и, возможно, это также объясняет, почему только первая кнопка, кажется, получает жест), поведение, которое вы описали в своем комментарии, напомнило мне, что UIScrollView
(базовый класс UITableView) жаден касаниями (хотя и не так сильно, как UIWebView
), и это наверняка влияет на то, как касания перенаправляются. Итак, я не знаю, работает ли это, но я нашел это в UIScrollView
:
delaysContentTouches
Если значением этого свойства является ДА, представление прокрутки задерживает обработку жеста касания до тех пор, пока не сможет определить, является ли целью прокрутка. Если значение равно NO, представление прокрутки немедленно вызывает touchesShouldBegin: withEvent: inContentView :. Значением по умолчанию является ДА.
Это может сработать или нет, даже UITableView может вообще не работать, но его легко попробовать.
Если это не сработает, а моя предыдущая гипотеза все еще верна, можно обойти это подклассом UITableView
и переопределить методы, связанные с касанием (например, touchesShouldBegin:withEvent:inContentView:
), чтобы вы могли настроить их поведение.
СТАРЫЙ и НЕПРАВИЛЬНЫЙ ОТВЕТ:
Насколько я понимаю, вы можете использовать один и тот же распознаватель жестов для разных представлений, например:
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_LButton addGestureRecognizer:rightSwipe];
[_SButton addGestureRecognizer:rightSwipe];
[_XButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
Я не знаю, может ли это решить вашу проблему, поскольку в вашем случае происходит следующее: независимо от того, какую кнопку вы проводите, всегда активируется первый распознаватель жестов, и это довольно сложно объяснить, поскольку вы есть разные кнопки. Это может быть связано с некоторым перекрытием (я предполагаю) между кнопками или с тем фактом, что все ваши кнопки «встроены» в ячейку таблицы, поэтому механизм смахивания на уровне ячейки мешает механизму смахивания на уровень подэлемента, но я не уверен в этом.
В качестве альтернативного подхода, который, безусловно, работает, вы можете прикрепить свой распознаватель жестов к самой ячейке таблицы (вы упомянули о своей попытке присоединить его к самому представлению таблицы; будет работать присоединение к ячейке таблицы).
Надеюсь, это поможет.