Browse Source

Fix ScrollView not scrollable in Overlay (#4561)

Fixes an issue with ScrollView inside an Overlay. While down events were propagated to the view, move events were consumed by the overlay preventing scroll components from functioning correctly.
Guy Carmeli 5 years ago
parent
commit
d3ab1ac526
No account linked to committer's email address

+ 2
- 4
lib/android/app/src/main/java/com/reactnativenavigation/views/touch/OverlayTouchDelegate.java View File

42
         TouchLocation location = getTouchLocation(event);
42
         TouchLocation location = getTouchLocation(event);
43
         if (location == TouchLocation.Inside) {
43
         if (location == TouchLocation.Inside) {
44
             reactView.dispatchTouchEventToJs(event);
44
             reactView.dispatchTouchEventToJs(event);
45
+            return false;
45
         }
46
         }
46
-        if (interceptTouchOutside.isTrue()) {
47
-            return location == TouchLocation.Inside;
48
-        }
49
-        return location == TouchLocation.Outside;
47
+        return interceptTouchOutside.isFalseOrUndefined();
50
     }
48
     }
51
 
49
 
52
     private TouchLocation getTouchLocation(MotionEvent ev) {
50
     private TouchLocation getTouchLocation(MotionEvent ev) {

+ 3
- 0
playground/src/app.js View File

11
           title
11
           title
12
         },
12
         },
13
         options: {
13
         options: {
14
+          layout: {
15
+            componentBackgroundColor: 'transparent'
16
+          },
14
           overlay: {
17
           overlay: {
15
             interceptTouchOutside: true
18
             interceptTouchOutside: true
16
           }
19
           }

+ 17
- 0
playground/src/screens/ComplexLayout.js View File

14
         <Button title={'External component in stack'} testID={testIDs.EXTERNAL_COMPONENT_IN_STACK} onPress={this.onExternalComponentInStackPressed} />
14
         <Button title={'External component in stack'} testID={testIDs.EXTERNAL_COMPONENT_IN_STACK} onPress={this.onExternalComponentInStackPressed} />
15
         <Button title={'External component in deep stack'} testID={testIDs.EXTERNAL_COMPONENT_IN_DEEP_STACK} onPress={this.onExternalComponentInDeepStackPressed} />
15
         <Button title={'External component in deep stack'} testID={testIDs.EXTERNAL_COMPONENT_IN_DEEP_STACK} onPress={this.onExternalComponentInDeepStackPressed} />
16
         <Button title={'SideMenu layout inside a bottomTab'} testID={testIDs.SIDE_MENU_LAYOUT_INSIDE_BOTTOM_TAB} onPress={this.onSideMenuLayoutInsideBottomTabPressed} />
16
         <Button title={'SideMenu layout inside a bottomTab'} testID={testIDs.SIDE_MENU_LAYOUT_INSIDE_BOTTOM_TAB} onPress={this.onSideMenuLayoutInsideBottomTabPressed} />
17
+        <Button title='Show touch through overlay with scroll' testID={testIDs.SHOW_TOUCH_THROUGH_OVERLAY_SCROLLER} onPress={() => this.onClickShowOverlayWithScroll(true)} />
17
       </View>
18
       </View>
18
     );
19
     );
19
   }
20
   }
151
       }
152
       }
152
     });
153
     });
153
   }
154
   }
155
+
156
+  onClickShowOverlayWithScroll = async (interceptTouchOutside) => {
157
+    await Navigation.showOverlay({
158
+      component: {
159
+        name: 'navigation.playground.CustomDialogWithScroll',
160
+        options: {
161
+          layout: {
162
+            componentBackgroundColor: 'transparent'
163
+          },
164
+          overlay: {
165
+            interceptTouchOutside
166
+          }
167
+        }
168
+      }
169
+    });
170
+  }
154
 }
171
 }
155
 
172
 
156
 module.exports = ComplexLayout;
173
 module.exports = ComplexLayout;

+ 4
- 16
playground/src/screens/OptionsScreen.js View File

133
         <Button title='Custom Transition' testID={testIDs.CUSTOM_TRANSITION_BUTTON} onPress={this.onClickCustomTransition} />
133
         <Button title='Custom Transition' testID={testIDs.CUSTOM_TRANSITION_BUTTON} onPress={this.onClickCustomTransition} />
134
         {Platform.OS === 'android' && <Button title='Hide fab' testID={testIDs.HIDE_FAB} onPress={this.onClickFab} />}
134
         {Platform.OS === 'android' && <Button title='Hide fab' testID={testIDs.HIDE_FAB} onPress={this.onClickFab} />}
135
         <Button title='Show overlay' testID={testIDs.SHOW_OVERLAY_BUTTON} onPress={() => this.onClickShowOverlay(true)} />
135
         <Button title='Show overlay' testID={testIDs.SHOW_OVERLAY_BUTTON} onPress={() => this.onClickShowOverlay(true)} />
136
-        <Button title='Show touch through overlay with scroll' testID={testIDs.SHOW_TOUCH_THROUGH_OVERLAY_SCROLLER} onPress={() => this.onClickShowOverlayWithScroll(true)} />
137
         <Button title='Show touch through overlay' testID={testIDs.SHOW_TOUCH_THROUGH_OVERLAY_BUTTON} onPress={() => this.onClickShowOverlay(false)} />
136
         <Button title='Show touch through overlay' testID={testIDs.SHOW_TOUCH_THROUGH_OVERLAY_BUTTON} onPress={() => this.onClickShowOverlay(false)} />
138
         <Button title='Push Default Options Screen' testID={testIDs.PUSH_DEFAULT_OPTIONS_BUTTON} onPress={this.onClickPushDefaultOptionsScreen} />
137
         <Button title='Push Default Options Screen' testID={testIDs.PUSH_DEFAULT_OPTIONS_BUTTON} onPress={this.onClickPushDefaultOptionsScreen} />
139
         <Button title='Show TopBar react view' testID={testIDs.SHOW_TOPBAR_REACT_VIEW} onPress={this.onShowTopBarReactView} />
138
         <Button title='Show TopBar react view' testID={testIDs.SHOW_TOPBAR_REACT_VIEW} onPress={this.onShowTopBarReactView} />
270
       component: {
269
       component: {
271
         name: 'navigation.playground.CustomDialog',
270
         name: 'navigation.playground.CustomDialog',
272
         options: {
271
         options: {
272
+          layout: {
273
+            componentBackgroundColor: 'transparent'
274
+          },
273
           overlay: {
275
           overlay: {
274
-            interceptTouchOutside
275
-          }
276
-        }
277
-      }
278
-    });
279
-  }
280
-
281
-  onClickShowOverlayWithScroll = async (interceptTouchOutside) => {
282
-    await Navigation.showOverlay({
283
-      component: {
284
-        name: 'navigation.playground.CustomDialogWithScroll',
285
-        options: {
286
-          overlay: {
287
-            interceptTouchOutside
276
+            interceptTouchOutside: false
288
           }
277
           }
289
         }
278
         }
290
       }
279
       }
291
     });
280
     });
292
   }
281
   }
293
 
282
 
294
-
295
   onClickPushDefaultOptionsScreen = () => {
283
   onClickPushDefaultOptionsScreen = () => {
296
     Navigation.setDefaultOptions({
284
     Navigation.setDefaultOptions({
297
       topBar: {
285
       topBar: {

+ 54
- 54
playground/src/screens/complexlayouts/CustomDialogWithScroll.js View File

1
 const React = require('react');
1
 const React = require('react');
2
 const { PureComponent } = require('react');
2
 const { PureComponent } = require('react');
3
 
3
 
4
-const { Text, Button, View, Alert, Platform ,ScrollView} = require('react-native');
4
+const { Text, Button, View, Alert, Platform, ScrollView, StyleSheet } = require('react-native');
5
 const { Navigation } = require('react-native-navigation');
5
 const { Navigation } = require('react-native-navigation');
6
 
6
 
7
 const testIDs = require('../../testIDs');
7
 const testIDs = require('../../testIDs');
8
 
8
 
9
 class CustomDialogWithScroll extends PureComponent {
9
 class CustomDialogWithScroll extends PureComponent {
10
-    static options() {
11
-        return {
12
-            statusBarBackgroundColor: 'green'
13
-        };
14
-    }
10
+  static options() {
11
+    return {
12
+      statusBarBackgroundColor: 'green'
13
+    };
14
+  }
15
 
15
 
16
-    render() {
17
-        return (
18
-            <View style={styles.container}>
19
-                <ScrollView style={styles.root}>
20
-                    <View style={{height: 60, backgroundColor: 'red'}}/>
21
-                    <View style={{height: 60, backgroundColor: 'green'}}/>
22
-                    <View style={{height: 60, backgroundColor: 'red'}}/>
23
-                    <View style={{height: 60, backgroundColor: 'green'}}/>
24
-                    <View style={{height: 60, backgroundColor: 'red'}}/>
25
-                    <View style={{height: 60, backgroundColor: 'green'}}/>
26
-                </ScrollView>
27
-            </View>
28
-        );
29
-    }
16
+  render() {
17
+    return (
18
+      <View style={styles.root}>
19
+        <View style={{ height: 200, width: '80%', alignSelf: 'center', flexDirection: 'row' }}>
20
+          <ScrollView style={styles.scrollView} contentContainerStyle={styles.content}>
21
+            <View style={{ height: 60, backgroundColor: 'red' }} />
22
+            <View style={{ height: 60, backgroundColor: 'green' }} />
23
+            <View style={{ height: 60, backgroundColor: 'red' }} />
24
+            <View style={{ height: 60, backgroundColor: 'green' }} />
25
+            <View style={{ height: 60, backgroundColor: 'red' }} />
26
+            <View style={{ height: 60, backgroundColor: 'green' }} />
27
+          </ScrollView>
28
+        </View>
29
+      </View>
30
+    );
31
+  }
30
 
32
 
31
-    didDisappear() {
32
-        if (Platform.OS === 'android') {
33
-            Alert.alert('Overlay disappeared');
34
-        }
33
+  didDisappear() {
34
+    if (Platform.OS === 'android') {
35
+      Alert.alert('Overlay disappeared');
35
     }
36
     }
37
+  }
36
 }
38
 }
37
 
39
 
38
-const styles = {
39
-    root: {
40
-        width: 400,
41
-        height: 200,
42
-    },
43
-    container: {
44
-
45
-        width: 400,
46
-        height: 200,
47
-        flexDirection: 'column',
48
-        justifyContent: 'center',
49
-        alignItems: 'center',
50
-        alignSelf: 'center'
51
-    },
52
-    h1: {
53
-        fontSize: 24,
54
-        textAlign: 'center',
55
-        margin: 10
56
-    },
57
-    h2: {
58
-        fontSize: 12,
59
-        textAlign: 'center',
60
-        margin: 10
61
-    },
62
-    footer: {
63
-        fontSize: 10,
64
-        color: '#888',
65
-        marginTop: 10
66
-    }
67
-};
40
+const styles = StyleSheet.create({
41
+  scrollView: {
42
+    backgroundColor: 'blue'
43
+  },
44
+  root: {
45
+    flex: 1,
46
+    flexDirection: 'column',
47
+    justifyContent: 'flex-end'
48
+  },
49
+  content: {
50
+    backgroundColor: 'blue'
51
+  },
52
+  h1: {
53
+    fontSize: 24,
54
+    textAlign: 'center',
55
+    margin: 10
56
+  },
57
+  h2: {
58
+    fontSize: 12,
59
+    textAlign: 'center',
60
+    margin: 10
61
+  },
62
+  footer: {
63
+    fontSize: 10,
64
+    color: '#888',
65
+    marginTop: 10
66
+  }
67
+});
68
 
68
 
69
 module.exports = CustomDialogWithScroll;
69
 module.exports = CustomDialogWithScroll;