Skip to content

Commit 72699db

Browse files
committed
fix(menu): fix scrolling page w/ side menus
Improved which angles should allow the side menu to open, depending if it’s a left or right menu. Also check if the distance of the drag is longer than a side menu would get. For example, scrolling vertically for a long ways would have a long distance, but triggering a side menu to open would be a short distance. Also ensure that a side menu can always be closed incase something goes wrong. Closes #5272
1 parent 8f44076 commit 72699db

File tree

5 files changed

+132
-8
lines changed

5 files changed

+132
-8
lines changed

ionic/components/menu/menu-gestures.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {SlideEdgeGesture} from '../../gestures/slide-edge-gesture';
33

44
import {assign} from '../../util/util';
55

6-
76
export class MenuContentGesture extends SlideEdgeGesture {
87

98
constructor(public menu: Menu, targetEl: Element, options = {}) {
@@ -19,8 +18,36 @@ export class MenuContentGesture extends SlideEdgeGesture {
1918
}
2019

2120
canStart(ev) {
22-
let validAngle = ((-35 <= ev.angle && ev.angle <= 35) || (180 >= ev.angle && ev.angle >= 145) || (-180 <= ev.angle && ev.angle <= -145));
23-
return this.menu.isOpen && this.menu.isEnabled && validAngle ? true : super.canStart(ev);
21+
let menu = this.menu;
22+
23+
console.debug('menu canStart, id', menu.id, 'angle', ev.angle, 'distance', ev.distance);
24+
25+
if (!menu.isEnabled || !menu.isSwipeEnabled) {
26+
console.debug('menu canStart, isEnabled', menu.isEnabled, 'isSwipeEnabled', menu.isSwipeEnabled, 'id', menu.id);
27+
return false;
28+
}
29+
30+
if (ev.distance > 50) {
31+
// the distance is longer than you'd expect a side menu swipe to be
32+
console.debug('menu canStart, distance too far', ev.distance, 'id', menu.id);
33+
return false;
34+
}
35+
36+
if (menu.side === 'left') {
37+
// left side menu
38+
if (ev.angle > -40 && ev.angle < 40) {
39+
return super.canStart(ev);
40+
}
41+
42+
} else if (menu.side === 'right') {
43+
// right side menu
44+
if ((ev.angle > 140 && ev.angle <= 180) || (ev.angle > -140 && ev.angle <= -180)) {
45+
return super.canStart(ev);
46+
}
47+
}
48+
49+
// didn't pass the test, don't open this menu
50+
return false;
2451
}
2552

2653
// Set CSS, then wait one frame for it to apply before sliding starts

ionic/components/menu/menu.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ export class Menu extends Ion {
282282
setOpen(shouldOpen) {
283283
// _isPrevented is used to prevent unwanted opening/closing after swiping open/close
284284
// or swiping open the menu while pressing down on the menuToggle button
285-
if (shouldOpen === this.isOpen || this._isPrevented()) {
285+
if ((shouldOpen && this.isOpen) || this._isPrevented()) {
286286
return Promise.resolve();
287287
}
288288

ionic/components/menu/test/basic/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class E2EApp {
6464
console.log('onMenuOpening', ev);
6565
}
6666

67-
isHidden() {
67+
isChangeDetecting() {
6868
console.log('Change detection', ++this.changeDetectionCount);
69-
return false;
69+
return true;
7070
}
7171
}

ionic/components/menu/test/basic/main.html

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<ion-menu [content]="content" id="leftMenu" side="left" (opening)="onMenuOpening($event)">
1+
<ion-menu [content]="content" id="leftMenu" side="left">
22

33
<ion-toolbar secondary>
44
<ion-title>Left Menu</ion-title>
@@ -12,7 +12,51 @@
1212
{{p.title}}
1313
</button>
1414

15-
<button ion-item menuClose="leftMenu" detail-none [hidden]="isHidden()">
15+
<button ion-item menuClose="leftMenu" detail-none>
16+
Close Menu
17+
</button>
18+
19+
<button ion-item menuClose="leftMenu" detail-none>
20+
Close Menu
21+
</button>
22+
23+
<button ion-item menuClose="leftMenu" detail-none>
24+
Close Menu
25+
</button>
26+
27+
<button ion-item menuClose="leftMenu" detail-none>
28+
Close Menu
29+
</button>
30+
31+
<button ion-item menuClose="leftMenu" detail-none>
32+
Close Menu
33+
</button>
34+
35+
<button ion-item menuClose="leftMenu" detail-none>
36+
Close Menu
37+
</button>
38+
39+
<button ion-item menuClose="leftMenu" detail-none>
40+
Close Menu
41+
</button>
42+
43+
<button ion-item menuClose="leftMenu" detail-none>
44+
Close Menu
45+
</button>
46+
47+
<button ion-item menuClose="leftMenu" detail-none>
48+
Close Menu
49+
</button>
50+
51+
<button ion-item menuClose="leftMenu" detail-none>
52+
Close Menu
53+
</button>
54+
55+
<button ion-item menuClose="leftMenu" detail-none>
56+
Close Menu
57+
</button>
58+
59+
<button ion-item menuClose="leftMenu" detail-none>
1660
Close Menu
1761
</button>
1862

@@ -40,9 +84,60 @@
4084
Close Menu
4185
</button>
4286

87+
<button ion-item menuClose="rightMenu" detail-none>
88+
Close Menu
89+
</button>
90+
91+
<button ion-item menuClose="rightMenu" detail-none>
92+
Close Menu
93+
</button>
94+
95+
<button ion-item menuClose="rightMenu" detail-none>
96+
Close Menu
97+
</button>
98+
99+
<button ion-item menuClose="rightMenu" detail-none>
100+
Close Menu
101+
</button>
102+
103+
<button ion-item menuClose="rightMenu" detail-none>
104+
Close Menu
105+
</button>
106+
107+
<button ion-item menuClose="rightMenu" detail-none>
108+
Close Menu
109+
</button>
110+
111+
<button ion-item menuClose="rightMenu" detail-none>
112+
Close Menu
113+
</button>
114+
115+
<button ion-item menuClose="rightMenu" detail-none>
116+
Close Menu
117+
</button>
118+
119+
<button ion-item menuClose="rightMenu" detail-none>
120+
Close Menu
121+
</button>
122+
123+
<button ion-item menuClose="rightMenu" detail-none>
124+
Close Menu
125+
</button>
126+
127+
<button ion-item menuClose="rightMenu" detail-none>
128+
Close Menu
129+
</button>
130+
131+
<button ion-item menuClose="rightMenu" detail-none>
132+
Close Menu
133+
</button>
134+
43135
</ion-list>
136+
44137
</ion-content>
45138

46139
</ion-menu>
47140

48141
<ion-nav id="nav" [root]="rootView" #content swipe-back-enabled="false"></ion-nav>
142+
143+
<div [hidden]="isChangeDetecting()"></div>

ionic/components/menu/test/basic/page1.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,6 @@ <h3>Page 1</h3>
5151
<button (click)="presentAlert()">Open alert</button>
5252
</p>
5353

54+
<f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f>
55+
5456
</ion-content>

0 commit comments

Comments
 (0)