diff --git a/ionic/components/menu/menu-gestures.ts b/ionic/components/menu/menu-gestures.ts
index c82ffb5959..87dc517c70 100644
--- a/ionic/components/menu/menu-gestures.ts
+++ b/ionic/components/menu/menu-gestures.ts
@@ -3,7 +3,6 @@ import {SlideEdgeGesture} from '../../gestures/slide-edge-gesture';
import {assign} from '../../util/util';
-
export class MenuContentGesture extends SlideEdgeGesture {
constructor(public menu: Menu, targetEl: Element, options = {}) {
@@ -19,8 +18,36 @@ export class MenuContentGesture extends SlideEdgeGesture {
}
canStart(ev) {
- let validAngle = ((-35 <= ev.angle && ev.angle <= 35) || (180 >= ev.angle && ev.angle >= 145) || (-180 <= ev.angle && ev.angle <= -145));
- return this.menu.isOpen && this.menu.isEnabled && validAngle ? true : super.canStart(ev);
+ let menu = this.menu;
+
+ console.debug('menu canStart, id', menu.id, 'angle', ev.angle, 'distance', ev.distance);
+
+ if (!menu.isEnabled || !menu.isSwipeEnabled) {
+ console.debug('menu canStart, isEnabled', menu.isEnabled, 'isSwipeEnabled', menu.isSwipeEnabled, 'id', menu.id);
+ return false;
+ }
+
+ if (ev.distance > 50) {
+ // the distance is longer than you'd expect a side menu swipe to be
+ console.debug('menu canStart, distance too far', ev.distance, 'id', menu.id);
+ return false;
+ }
+
+ if (menu.side === 'left') {
+ // left side menu
+ if (ev.angle > -40 && ev.angle < 40) {
+ return super.canStart(ev);
+ }
+
+ } else if (menu.side === 'right') {
+ // right side menu
+ if ((ev.angle > 140 && ev.angle <= 180) || (ev.angle > -140 && ev.angle <= -180)) {
+ return super.canStart(ev);
+ }
+ }
+
+ // didn't pass the test, don't open this menu
+ return false;
}
// Set CSS, then wait one frame for it to apply before sliding starts
diff --git a/ionic/components/menu/menu.ts b/ionic/components/menu/menu.ts
index 406f9eeefe..16836ff46e 100644
--- a/ionic/components/menu/menu.ts
+++ b/ionic/components/menu/menu.ts
@@ -282,7 +282,7 @@ export class Menu extends Ion {
setOpen(shouldOpen) {
// _isPrevented is used to prevent unwanted opening/closing after swiping open/close
// or swiping open the menu while pressing down on the menuToggle button
- if (shouldOpen === this.isOpen || this._isPrevented()) {
+ if ((shouldOpen && this.isOpen) || this._isPrevented()) {
return Promise.resolve();
}
diff --git a/ionic/components/menu/test/basic/index.ts b/ionic/components/menu/test/basic/index.ts
index a23df1a89c..c9c922e607 100644
--- a/ionic/components/menu/test/basic/index.ts
+++ b/ionic/components/menu/test/basic/index.ts
@@ -64,8 +64,8 @@ class E2EApp {
console.log('onMenuOpening', ev);
}
- isHidden() {
+ isChangeDetecting() {
console.log('Change detection', ++this.changeDetectionCount);
- return false;
+ return true;
}
}
diff --git a/ionic/components/menu/test/basic/main.html b/ionic/components/menu/test/basic/main.html
index 81ac00582e..ee03015948 100644
--- a/ionic/components/menu/test/basic/main.html
+++ b/ionic/components/menu/test/basic/main.html
@@ -1,4 +1,4 @@
-