React Native抽屉在地图上滑动时无法打开

4
我将使用react-native-navigation启动一个包含Google地图的单屏应用,使用react-native-maps和左侧抽屉菜单:
导航:
Navigation.startSingleScreenApp({
        screen: {
            screen : 'map.MapScreen',
            title : 'Map',
            navigatorStyle: {
                navBarHidden: true
            }
        },
        drawer : {
            left : {
                screen : 'drawer.DrawerScreen',
                passProps: {}
            },
            disableOpenGesture: true
        },
        animationType: 'slide-down',
        passProps: {}
    })

地图屏幕:
export default class MapScreen extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <View style={styles.container}>
                <MapView
                    style={styles.map}
                    provider={PROVIDER_GOOGLE}>
                </MapView>
            </View>
        )
    }



}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        zIndex: -1
    },
    map: {
        ...StyleSheet.absoluteFillObject,
    },
});

很遗憾,如果我试图通过在地图上向右滑动来打开抽屉,它不会打开。

有人有任何修复这个问题的想法吗?

3个回答

6
你可以使用覆盖层在地图边缘添加一些不可见的边缘,以捕获打开抽屉的手势。看起来像这样:
const Screen = {
  width: Dimensions.get('window').width,
  height: Dimensions.get('window').height,
};
class Foo extends React.Component<Props, object> {
  render() {
    return (
      <View style={styles.container}>
        <MapView
          style={styles.mapContainer}
        />
        <View style={styles.mapDrawerOverlay} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  mapContainer: {
    width: Screen.width,
    height: Dimensions.get('window').height,
  },
  mapDrawerOverlay: {
    position: 'absolute',
    left: 0,
    top: 0,
    opacity: 0.0,
    height: Dimensions.get('window').height,
    width: 10,
  },
});

这将使用一个透明的覆盖层,覆盖地图视图的一小部分。现在在这个区域开始拖动手势可以触发抽屉。

maps with drawer


0
你需要在地图边缘碰到被薄的TouchableOpacity覆盖的窗口时激活ToggleDrawer()。以下是在homeview中的示例代码,请确保将props作为一个变量引入到你的函数中。
import React from 'react';
import {View, Text, SafeAreaView, StyleSheet, Dimensions, TouchableOpacity} from 'react-native';

import MapView, {Marker} from 'react-native-maps';

const HomeScreen = (props) => {

    
    
    return(
        <SafeAreaView style = {{flex: 1}}>
            <View style = {styles.container}>
            <MapView
          style={styles.mapStyle}
          initialRegion={{
            latitude: 37.78825,
            longitude: -122.4324,
            latitudeDelta: 0.0922,
            longitudeDelta: 0.0421,
          }}
            }
          />
        </MapView>
        <TouchableOpacity style = {styles.mapDrawerOverlay} onPress = {() => {
                    props.navigationProps.toggleDrawer();}
         } />
            </View>
        </SafeAreaView>
    );
};

export default HomeScreen;


  const styles = StyleSheet.create({
    container: {
      position: 'absolute',
      top: 0,
      left: 0,
      right: 0,
      bottom: 0,
      alignItems: 'center',
      justifyContent: 'flex-end',
    },
    mapDrawerOverlay:{
        position: 'absolute',
        left: 0,
        top: 0,
        opacity: 0.0,
        height: Dimensions.get('window').height,
        width:10,

    },
    mapStyle: {
      position: 'absolute',
      top: 0,
      left: 0,
      right: 0,
      bottom: 0,
    },
  });

0

在地图样式中不要使用StyleSheet.absoluteFillObject。 这样做将解决您的问题。

const React = require("react-native");

const { StyleSheet, Dimensions } = React;
const { width, height } = Dimensions.get("window");
export default {

  map: {
    width: width,
    height: height
  }
};


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接