Skip to content

Commit c0976e2

Browse files
committed
fix: a lot of gesture overrides fixes
1 parent 3897686 commit c0976e2

File tree

4 files changed

+122
-81
lines changed

4 files changed

+122
-81
lines changed

src/gesturehandler.android.ts

Lines changed: 56 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -46,62 +46,76 @@ class PageGestureExtended extends Page {
4646
}
4747
}
4848
let installed = false;
49+
let installedOverrides = false;
4950
export function install(overrideNGestures = false) {
50-
if (installed) {
51-
return;
52-
}
53-
installed = true;
54-
installBase();
55-
const NSPage = require('@nativescript/core/ui/page').Page;
56-
NSPage.prototype.createNativeView = function () {
57-
if (!PageLayout) {
58-
PageLayout = com.nativescript.gesturehandler.PageLayout;
59-
}
60-
const layout = new PageLayout(this._context);
61-
this.gestureRegistry = layout.registry;
62-
return layout;
63-
};
64-
applyMixins(NSPage, [PageGestureExtended]);
65-
if (overrideNGestures === true) {
51+
console.log('install', overrideNGestures, installed, installedOverrides);
52+
if (!installed) {
53+
installed = true;
54+
installBase();
55+
const NSPage = require('@nativescript/core/ui/page').Page;
56+
NSPage.prototype.createNativeView = function () {
57+
if (!PageLayout) {
58+
PageLayout = com.nativescript.gesturehandler.PageLayout;
59+
}
60+
const layout = new PageLayout(this._context);
61+
this.gestureRegistry = layout.registry;
62+
return layout;
63+
};
64+
applyMixins(NSPage, [PageGestureExtended]);
65+
}
66+
67+
if (overrideNGestures === true && !installedOverrides) {
68+
installedOverrides = true;
6669
const NSView = require('@nativescript/core/ui/core/view').View;
70+
const NSButtonBase = require('@nativescript/core/ui/button').ButtonBase;
71+
const NSButton = require('@nativescript/core/ui/button').Button;
72+
delete NSButtonBase.tapEvent;
73+
// we need to disable on click listener
74+
NSButton.prototype.initNativeView = function () {
75+
NSButtonBase.prototype.initNativeView.call(this);
76+
};
77+
NSButton.prototype.disposeNativeView = function () {
78+
NSButtonBase.prototype.disposeNativeView.call(this);
79+
};
6780
NSView.prototype._observe = function (type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): void {
6881
if (!this._gestureObservers[type]) {
6982
this._gestureObservers[type] = [];
7083
}
7184

85+
console.log('_observe', this, type, typeof this._gestureObservers[type]);
7286
this._gestureObservers[type].push(gestureObserve(this, type, callback, thisArg));
73-
if (type & GestureTypes.touch && this.isLoaded && !this.touchListenerIsSet) {
87+
if (this.isLoaded && !this.touchListenerIsSet) {
7488
this.setOnTouchListener();
7589
}
7690
};
77-
NSView.prototype.setOnTouchListener = function () {
78-
if (!this.nativeViewProtected || !this.getGestureObservers(GestureTypes.touch)) {
79-
return;
80-
}
81-
// do not set noop listener that handles the event (disabled listener) if IsUserInteractionEnabled is
82-
// false as we might need the ability for the event to pass through to a parent view
83-
this.touchListener =
84-
this.touchListener ||
85-
new android.view.View.OnTouchListener({
86-
onTouch: (view: android.view.View, event: android.view.MotionEvent) => {
87-
this.handleGestureTouch(event);
88-
89-
const nativeView = this.nativeViewProtected;
90-
if (!nativeView || !nativeView.onTouchEvent) {
91-
return false;
92-
}
91+
// NSView.prototype.setOnTouchListener = function () {
92+
// if (!this.nativeViewProtected || !this.getGestureObservers(GestureTypes.touch)) {
93+
// return;
94+
// }
95+
// // do not set noop listener that handles the event (disabled listener) if IsUserInteractionEnabled is
96+
// // false as we might need the ability for the event to pass through to a parent view
97+
// this.touchListener =
98+
// this.touchListener ||
99+
// new android.view.View.OnTouchListener({
100+
// onTouch: (view: android.view.View, event: android.view.MotionEvent) => {
101+
// this.handleGestureTouch(event);
93102

94-
return nativeView.onTouchEvent(event);
95-
},
96-
});
97-
this.nativeViewProtected.setOnTouchListener(this.touchListener);
103+
// const nativeView = this.nativeViewProtected;
104+
// if (!nativeView || !nativeView.onTouchEvent) {
105+
// return false;
106+
// }
98107

99-
this.touchListenerIsSet = true;
108+
// return nativeView.onTouchEvent(event);
109+
// },
110+
// });
111+
// this.nativeViewProtected.setOnTouchListener(this.touchListener);
100112

101-
if (this.nativeViewProtected.setClickable) {
102-
this.nativeViewProtected.setClickable(this.isUserInteractionEnabled);
103-
}
104-
};
113+
// this.touchListenerIsSet = true;
114+
// console.log('setOnTouchListener', this);
115+
// if (this.nativeViewProtected.setClickable) {
116+
// this.nativeViewProtected.setClickable(this.isUserInteractionEnabled);
117+
// }
118+
// };
105119
}
106120
}
107121

src/gesturehandler.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export { GestureState, GestureHandlerStateEvent, GestureHandlerTouchEvent, Gestu
77
// export * from './gesturehandler.ios';
88

99
export enum FlingDirection {
10-
DIRECTION_LEFT ,
10+
DIRECTION_LEFT,
1111
DIRECTION_UP,
1212
DIRECTION_DOWN,
1313
DIRECTION_RIGHT,

src/gesturehandler.ios.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,25 @@ export enum FlingDirection {
2929
}
3030

3131
let installed = false;
32+
let installedOverrides = false;
3233
export function install(overrideNGestures = false) {
33-
if (installed) {
34-
return;
34+
if (!installed) {
35+
installed = true;
36+
installBase();
3537
}
36-
installed = true;
37-
installBase();
38-
if (overrideNGestures === true) {
38+
39+
if (overrideNGestures === true && !installedOverrides) {
40+
installedOverrides = true;
3941
const NSView = require('@nativescript/core/ui/core/view').View;
4042
NSView.prototype._observe = function (type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): void {
4143
if (!this._gestureObservers[type]) {
4244
this._gestureObservers[type] = [];
4345
}
4446

4547
this._gestureObservers[type].push(gestureObserve(this, type, callback, thisArg));
46-
if (type & GestureTypes.touch && this.isLoaded && !this.touchListenerIsSet) {
47-
this.setOnTouchListener();
48-
}
48+
// if (type & GestureTypes.touch && this.isLoaded && !this.touchListenerIsSet) {
49+
// this.setOnTouchListener();
50+
// }
4951
};
5052
}
5153
}

src/gestures_override.ts

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let TAG = 0;
1414
export class GesturesObserver {
1515
private _callback: (args: GestureEventData) => void;
1616
private _target: View & {
17-
_gestureObservers?: any;
17+
_gestureHandlers?: any;
1818
};
1919
private _context: any;
2020

@@ -72,9 +72,9 @@ export class GesturesObserver {
7272
}
7373
}
7474
list.length = 0;
75-
if (this.target._gestureObservers[this.type]) {
76-
this.target._gestureObservers[this.type].detachFromView();
77-
delete this.target._gestureObservers[this.type];
75+
if (this.target._gestureHandlers && this.target._gestureHandlers[this.type]) {
76+
this.target._gestureHandlers[this.type].detachFromView();
77+
delete this.target._gestureHandlers[this.type];
7878
}
7979
}
8080
}
@@ -145,63 +145,88 @@ export class GesturesObserver {
145145
}
146146
};
147147
}
148-
private _attach(target: View, type: GestureTypes) {
148+
private _attach(
149+
target: View & {
150+
_gestureHandlers?: any;
151+
},
152+
type: GestureTypes
153+
) {
149154
if (type & GestureTypes.touch) {
150155
this._notifyTouch = true;
151156
}
152157
const manager = Manager.getInstance();
158+
if (!target._gestureHandlers) {
159+
target._gestureHandlers = {};
160+
}
161+
let gestureHandler = target._gestureHandlers[type];
162+
153163
if (type & GestureTypes.tap) {
154-
const gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['TAP_HANDLER_TAG'], {
155-
waitFor: [target['LONGPRESS_HANDLER_TAG'], target['DOUBLE_TAP_HANDLER_TAG']],
156-
});
164+
if (!gestureHandler) {
165+
gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['TAP_HANDLER_TAG'], {
166+
waitFor: [target['LONGPRESS_HANDLER_TAG'], target['DOUBLE_TAP_HANDLER_TAG']],
167+
});
168+
gestureHandler.attachToView(target);
169+
console.log('_attach', target, type);
170+
target._gestureHandlers[type] = gestureHandler;
171+
}
157172
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.tap, GestureState.ACTIVE), this);
158-
gestureHandler.attachToView(target);
159-
target._gestureObservers[type] = gestureHandler;
160173
}
161174
if (type & GestureTypes.longPress) {
162-
const gestureHandler = manager.createGestureHandler(HandlerType.LONG_PRESS, target['LONGPRESS_HANDLER_TAG']);
175+
if (!gestureHandler) {
176+
gestureHandler = manager.createGestureHandler(HandlerType.LONG_PRESS, target['LONGPRESS_HANDLER_TAG']);
177+
gestureHandler.attachToView(target);
178+
target._gestureHandlers[type] = gestureHandler;
179+
}
163180
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.longPress, GestureState.ACTIVE), this);
164-
gestureHandler.attachToView(target);
165-
target._gestureObservers[type] = gestureHandler;
166181
}
167182
if (type & GestureTypes.doubleTap) {
168-
const gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['DOUBLE_TAP_HANDLER_TAG'], {
169-
numberOfTaps: 2,
170-
});
183+
if (!gestureHandler) {
184+
gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['DOUBLE_TAP_HANDLER_TAG'], {
185+
numberOfTaps: 2,
186+
});
187+
gestureHandler.attachToView(target);
188+
target._gestureHandlers[type] = gestureHandler;
189+
}
171190
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.doubleTap), this);
172-
gestureHandler.attachToView(target);
173-
target._gestureObservers[type] = gestureHandler;
174191
}
175192

176193
if (type & GestureTypes.pinch) {
177-
const gestureHandler = manager.createGestureHandler(HandlerType.PINCH, TAG++);
194+
if (!gestureHandler) {
195+
gestureHandler = manager.createGestureHandler(HandlerType.PINCH, TAG++);
196+
gestureHandler.attachToView(target);
197+
target._gestureHandlers[type] = gestureHandler;
198+
}
178199
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.pinch), this);
179200
gestureHandler.on(GestureHandlerTouchEvent, this.onGestureTouchChange(GestureTypes.pinch), this);
180-
gestureHandler.attachToView(target);
181-
target._gestureObservers[type] = gestureHandler;
182201
}
183202

184203
if (type & GestureTypes.swipe) {
185-
const gestureHandler = manager.createGestureHandler(HandlerType.FLING, TAG++);
204+
if (!gestureHandler) {
205+
gestureHandler = manager.createGestureHandler(HandlerType.FLING, TAG++);
206+
gestureHandler.attachToView(target);
207+
target._gestureHandlers[type] = gestureHandler;
208+
}
186209
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.swipe), this);
187-
gestureHandler.attachToView(target);
188-
target._gestureObservers[type] = gestureHandler;
189210
}
190211

191212
if (type & GestureTypes.pan) {
192-
const gestureHandler = manager.createGestureHandler(HandlerType.PAN, TAG++, {});
213+
if (!gestureHandler) {
214+
gestureHandler = manager.createGestureHandler(HandlerType.PAN, TAG++, {});
215+
gestureHandler.attachToView(target);
216+
target._gestureHandlers[type] = gestureHandler;
217+
}
193218
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.pan), this);
194219
gestureHandler.on(GestureHandlerTouchEvent, this.onGestureTouchChange(GestureTypes.pan), this);
195-
gestureHandler.attachToView(target);
196-
target._gestureObservers[type] = gestureHandler;
197220
}
198221

199222
if (type & GestureTypes.rotation) {
200-
const gestureHandler = manager.createGestureHandler(HandlerType.ROTATION, TAG++, {});
223+
if (!gestureHandler) {
224+
gestureHandler = manager.createGestureHandler(HandlerType.ROTATION, TAG++, {});
225+
gestureHandler.attachToView(target);
226+
target._gestureHandlers[type] = gestureHandler;
227+
}
201228
gestureHandler.on(GestureHandlerStateEvent, this.onGestureStateChange(GestureTypes.rotation), this);
202229
gestureHandler.on(GestureHandlerTouchEvent, this.onGestureTouchChange(GestureTypes.rotation), this);
203-
gestureHandler.attachToView(target);
204-
target._gestureObservers[type] = gestureHandler;
205230
}
206231
if (type & GestureTypes.touch && global.isIOS) {
207232
// let s not reimplement it for touch

0 commit comments

Comments
 (0)