UITapGestureRecognizer - один кран и двойной кран
Я пытаюсь добавить 2 UITapGestureRecognizers
к представлению, один для одного крана и один для событий с двойным нажатием. Устройство распознавания однократного нажатия работает как ожидалось (само по себе). Но, похоже, я не могу заставить работать распознаватель двойного нажатия.
Попробовали поэкспериментировать с такими свойствами, как: cancelsTouchesInView
, delaysTouchesBegan
и delaysTouchesEnded
, но все еще не работают.
Когда я дважды нажимаю, распознаватель однократного нажатия всегда будет активирован, а событие двойного нажатия также будет отправлено на супер-просмотр. Но пользовательский распознаватель двойного нажатия не кажется вообще уведомленным.
Документация, похоже, предполагает, что 3 свойства, упомянутые выше, могут быть использованы для этой цели. Но я просто не знаю, какие значения должны быть установлены и на каких распознавателях (одиночных, двойных или обоих). Надеюсь, кто-то, кто знаком с этим, может помочь.
Ниже приведен последний обновленный блок кода.
// ****** gesture recognizers ******
- (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view
{
// single tap
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];
[singleTapRecognizer setNumberOfTouchesRequired:1];
[view addGestureRecognizer: singleTapRecognizer];
// double tap
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];
[doubleTapRecognizer setNumberOfTouchesRequired:2];
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
[view addGestureRecognizer: doubleTapRecognizer];
}
- (void)handleSingleTapOnView:(id)sender
{
}
- (void)handleDoubleTapOnView:(id)sender
{
}
Ответы
Ответ 1
UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap)] autorelease];
singleTap.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:singleTap];
UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)] autorelease];
doubleTap.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleTap];
[singleTap requireGestureRecognizerToFail:doubleTap];
Примечание. Если вы используете numberOfTouchesRequired
оно должно быть .numberOfTouchesRequired = 1;
Для Свифта
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didPressPartButton))
singleTapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTapGesture)
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)
singleTapGesture.require(toFail: doubleTapGesture)
Ответ 2
Решение Swift 3:
let singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTap)
let doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTap)
singleTap.require(toFail: doubleTap)
В строке кода singleTap.require(toFail: doubleTap) мы вынуждаем один кран ждать и убедитесь, что событие крана не является двойным нажатием.
Ответ 3
Вам необходимо использовать метод requireGestureRecognizerToFail:. Что-то вроде этого:
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
Ответ 4
//---- во-первых, вам нужно выделить двойной и одиночный жест выделения -------//
UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];
[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];
//----------------------- количество отводов ----------------//
[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];
//------- добавьте двойной крафт и один жест выделения на представление или кнопку --------//
[self.view addGestureRecognizer : doubleTap];
[self.view addGestureRecognizer : singleTap];
Ответ 5
Не уверен, что именно это вы ищете, но я сделал одиночные/двойные ответкители без распознавателей жестов. Я использую его в UITableView, поэтому я использовал этот код в методе didSelectRowAtIndexPath
tapCount++;
switch (tapCount)
{
case 1: //single tap
[self performSelector:@selector(singleTap:) withObject: indexPath afterDelay: 0.2];
break;
case 2: //double tap
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap:) object:indexPath];
[self performSelector:@selector(doubleTap:) withObject: indexPath];
break;
default:
break;
}
if (tapCount>2) tapCount=0;
Методы singleTap и doubleTap являются недействительными с NSIndexPath как параметр:
- (void)singleTap:(NSIndexPath *)indexPath {
//do your stuff for a single tap
}
- (void)doubleTap:(NSIndexPath *)indexPath {
//do your stuff for a double tap
}
Надеюсь, что это поможет
Ответ 6
Решение для Swift 2:
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap))
singleTapGesture.numberOfTapsRequired = 1 // Optional for single tap
view.addGestureRecognizer(singleTapGesture)
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)
singleTapGesture.requireGestureRecognizerToFail(doubleTapGesture)
Ответ 7
Я применил методы UIGestureRecognizerDelegate для обнаружения как singleTap, так и doubleTap.
Просто сделайте это.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)];
[doubleTap setDelegate:self];
doubleTap.numberOfTapsRequired = 2;
[self.headerView addGestureRecognizer:doubleTap];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)];
singleTap.numberOfTapsRequired = 1;
[singleTap setDelegate:self];
[doubleTap setDelaysTouchesBegan:YES];
[singleTap setDelaysTouchesBegan:YES];
[singleTap requireGestureRecognizerToFail:doubleTap];
[self.headerView addGestureRecognizer:singleTap];
Затем реализуем эти методы делегатов.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
Ответ 8
В некотором представлении есть встроенные распознаватели двойного нажатия (MKMapView
). Чтобы обойти это, вам нужно реализовать метод UIGestureRecognizerDelegate
shouldRecognizeSimultaneouslyWithGestureRecognizer
и вернуть YES
:
Сначала реализуйте свои двойные и одиночные распознаватели:
// setup gesture recognizers
UITapGestureRecognizer* singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(mapViewTapped:)];
singleTapRecognizer.delegate = self;
singleTapRecognizer.numberOfTapsRequired = 1;
UITapGestureRecognizer* doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(mapViewDoubleTapped:)];
doubleTapRecognizer.delegate = self; // this allows
doubleTapRecognizer.numberOfTapsRequired = 2;
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
И затем реализуем:
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer { return YES; }
Ответ 9
В отношении комментария @stanley -
Не пытайтесь использовать жесты жесткого диска для выбора строк для работы в UITableView
, поскольку он уже имеет полную обработку отводов.
Но вы должны установить "Отменяет привязку в представлении" на "НЕТ" на ваших одноразовых распознавателях жестов или он никогда не получит события крана.