-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Environment
- CLI: latest
- Cross-platform modules: 5.4.0
- Android Runtime: 5.4.0
- iOS Runtime: 5.4.0
Describe the bug
When you have a tap and double tap gesture recognizer on a view and you attempt to double tap, the tap handler fires. The tap gesture event should not fire if you're attempting a double tap. Take a look at the "Additional context" for the commit that allowed this.
To Reproduce
export class TestLayout extends StackLayout {
onLoaded() {
super.onLoaded();
this.on(GestureTypes.tap, () => console.log('Tapped'));
this.on(GestureTypes.doubleTap, () => console.log('Double tapped'));
}
}
If you attempt to double tap on the TestLayout, the console will show:
Tapped
Double tapped
Expected behavior
If you try to double tap on a view with a tap gesture recognizer and a double tap gesture recognizer, the double tap event should fire and the tap should not.
Additional context
I have been working through this issue with @MartoYankov .
Here is the commit that allowed simultaneous gesture events
Here are the docs to the delegate method that could be implemented for iOS
- I have already implemented this ^ for iOS (see below). The issue now is getting the same functionality for Android.
Potential solution (iOS)
gestures.ios.ts
class UIGestureRecognizerDelegateImpl extends NSObject implements UIGestureRecognizerDelegate {
public static ObjCProtocols = [UIGestureRecognizerDelegate];
public gestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer(gestureRecognizer: UIGestureRecognizer, otherGestureRecognizer: UIGestureRecognizer): boolean {
// If both gesture recognizers are of type UITapGestureRecognizer, do not allow
// simultaneous recognition.
if (gestureRecognizer instanceof UITapGestureRecognizer && otherGestureRecognizer instanceof UITapGestureRecognizer) {
return false;
}
return true;
}
public gestureRecognizerShouldRequireFailureOfGestureRecognizer(gestureRecognizer: UIGestureRecognizer, otherGestureRecognizer: UIGestureRecognizer): boolean {
// If both gesture recognizers are of type UITapGestureRecognizer & one of them is a doubleTap,
// we must require a failure.
if (gestureRecognizer instanceof UITapGestureRecognizer
&& otherGestureRecognizer instanceof UITapGestureRecognizer
&& otherGestureRecognizer.numberOfTapsRequired === 2) {
return true;
}
return false;
}
}