mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 03:31:45 +08:00
Gestures are now detached when a View is unloaded.
This commit is contained in:
@ -1,11 +1,8 @@
|
|||||||
import common = require("ui/gestures/gestures-common");
|
import common = require("ui/gestures/gestures-common");
|
||||||
import definition = require("ui/gestures");
|
import definition = require("ui/gestures");
|
||||||
import view = require("ui/core/view");
|
import view = require("ui/core/view");
|
||||||
|
import observable = require("data/observable");
|
||||||
//var OWNER = "_owner";
|
import trace = require("trace");
|
||||||
//var CALLBACK = "_callback";
|
|
||||||
//var TYPE = "_type";
|
|
||||||
//var TARGET = "_target";
|
|
||||||
|
|
||||||
// merge the exports of the request file with the exports of this file
|
// merge the exports of the request file with the exports of this file
|
||||||
declare var exports;
|
declare var exports;
|
||||||
@ -57,17 +54,42 @@ export class GesturesObserver implements definition.GesturesObserver {
|
|||||||
public _target: view.View;
|
public _target: view.View;
|
||||||
private _recognizers: {};
|
private _recognizers: {};
|
||||||
|
|
||||||
|
private _onTargetLoaded: (data: observable.EventData) => void;
|
||||||
|
private _onTargetUnloaded: (data: observable.EventData) => void;
|
||||||
|
|
||||||
constructor(callback: (args: definition.GestureEventData) => void) {
|
constructor(callback: (args: definition.GestureEventData) => void) {
|
||||||
this._callback = callback;
|
this._callback = callback;
|
||||||
this._recognizers = {};
|
this._recognizers = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
public observe(target: view.View, type: definition.GestureTypes) {
|
public observe(target: view.View, type: definition.GestureTypes) {
|
||||||
this.disconnect();
|
if (target) {
|
||||||
|
|
||||||
this._target = target;
|
this._target = target;
|
||||||
if (this._target && this._target._nativeView && this._target._nativeView.addGestureRecognizer) {
|
this._onTargetLoaded = args => {
|
||||||
var nativeView = <UIView>this._target._nativeView;
|
trace.write(this._target + ".target loaded. _nativeView:" + this._target._nativeView, "gestures");
|
||||||
|
this._attach(target, type);
|
||||||
|
};
|
||||||
|
this._onTargetUnloaded = args => {
|
||||||
|
trace.write(this._target + ".target unloaded. _nativeView:" + this._target._nativeView, "gestures");
|
||||||
|
this._dettach();
|
||||||
|
};
|
||||||
|
|
||||||
|
target.on(view.knownEvents.loaded, this._onTargetLoaded);
|
||||||
|
target.on(view.knownEvents.unloaded, this._onTargetUnloaded);
|
||||||
|
|
||||||
|
if (target.isLoaded) {
|
||||||
|
this._attach(target, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private _attach(target: view.View, type: definition.GestureTypes) {
|
||||||
|
trace.write(target + "._attach() _nativeView:" + target._nativeView, "gestures");
|
||||||
|
this._dettach();
|
||||||
|
|
||||||
|
if (target && target._nativeView && target._nativeView.addGestureRecognizer) {
|
||||||
|
var nativeView = <UIView>target._nativeView;
|
||||||
|
|
||||||
if (type & definition.GestureTypes.tap) {
|
if (type & definition.GestureTypes.tap) {
|
||||||
nativeView.addGestureRecognizer(this._createRecognizer(definition.GestureTypes.tap));
|
nativeView.addGestureRecognizer(this._createRecognizer(definition.GestureTypes.tap));
|
||||||
@ -88,7 +110,7 @@ export class GesturesObserver implements definition.GesturesObserver {
|
|||||||
|
|
||||||
if (type & definition.GestureTypes.pan) {
|
if (type & definition.GestureTypes.pan) {
|
||||||
nativeView.addGestureRecognizer(this._createRecognizer(definition.GestureTypes.pan, args => {
|
nativeView.addGestureRecognizer(this._createRecognizer(definition.GestureTypes.pan, args => {
|
||||||
this._executeCallback(_getPanData(args, this._target._nativeView));
|
this._executeCallback(_getPanData(args, target._nativeView));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,9 +144,9 @@ export class GesturesObserver implements definition.GesturesObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public disconnect() {
|
private _dettach() {
|
||||||
|
trace.write(this._target + "._dettach() _nativeView:" + this._target._nativeView, "gestures");
|
||||||
if (this._target && this._target._nativeView) {
|
if (this._target && this._target._nativeView) {
|
||||||
|
|
||||||
for (var name in this._recognizers) {
|
for (var name in this._recognizers) {
|
||||||
if (this._recognizers.hasOwnProperty(name)) {
|
if (this._recognizers.hasOwnProperty(name)) {
|
||||||
var item = <RecognizerCache>this._recognizers[name];
|
var item = <RecognizerCache>this._recognizers[name];
|
||||||
@ -134,12 +156,22 @@ export class GesturesObserver implements definition.GesturesObserver {
|
|||||||
item.target = null;
|
item.target = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._recognizers = {};
|
this._recognizers = {};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public disconnect() {
|
||||||
|
this._dettach();
|
||||||
|
|
||||||
|
if (this._target) {
|
||||||
|
this._target.off(view.knownEvents.loaded, this._onTargetLoaded);
|
||||||
|
this._target.off(view.knownEvents.unloaded, this._onTargetUnloaded);
|
||||||
|
|
||||||
|
this._onTargetLoaded = null;
|
||||||
|
this._onTargetUnloaded = null;
|
||||||
this._target = null;
|
this._target = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private _executeCallback(args: definition.GestureEventData) {
|
private _executeCallback(args: definition.GestureEventData) {
|
||||||
if (this._callback) {
|
if (this._callback) {
|
||||||
|
Reference in New Issue
Block a user