【问题标题】:React native maps callout press not triggering on IOS反应原生地图标注按下未在 IOS 上触发
【发布时间】:2019-12-05 14:05:17
【问题描述】:

我正在使用反应原生地图,并且我正在尝试在按下标记标注时添加事件侦听器。它适用于Android,但不适用于IOS。在这第一个 sn-p calloutPress 在 Android 上被调用,但在 IOS 上没有:

<MapView
    provider={PROVIDER_GOOGLE}
    style={styles.map}
    rotateEnabled={false}
    mapType="standard"
    initialRegion={region} 
>
    <Marker coordinate={markerCoordinate} onCalloutPress={() => this.calloutPress()}>
        <Callout>
            <View>
                <Text style={styles.calloutTitle}>My title</Text>
                <Text style={styles.calloutDescription}>My description</Text>
            </View>
        </Callout>
    </Marker>
</MapView>

我还在标注中尝试了可触摸的不透明度,现在 calloutPress 在 Android 或 IOS 上都没有被调用:

<MapView
    provider={PROVIDER_GOOGLE}
    style={styles.map}
    rotateEnabled={false}
    mapType="standard"
    initialRegion={region}
>
    <Marker coordinate={markerCoordinate}>
        <Callout>
            <TouchableOpacity onPress={() => this.calloutPress()}>
                <Text style={styles.calloutTitle}>My title</Text>
                <Text style={styles.calloutDescription}>My description</Text>
            </TouchableOpacity>
        </Callout>
    </Marker>
</MapView>

这是完整的课程:

import React, { Component } from "react";
import { View, StyleSheet, Text, TouchableOpacity } from "react-native";
import MapView, { Marker, Callout, PROVIDER_GOOGLE } from "react-native-maps";

export default class MapTabs extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <View style={styles.mapContainer}>
                <MapView
                    provider={PROVIDER_GOOGLE}
                    style={styles.map}
                    rotateEnabled={false}
                    mapType="standard"
                    initialRegion={region}
                >
                    <Marker coordinate={markerCoordinate}>
                        <Callout>
                            <TouchableOpacity onPress={() => this.calloutPress()}>
                                <Text style={styles.calloutTitle}>My title</Text>
                                <Text style={styles.calloutDescription}>My description</Text>
                            </TouchableOpacity>
                        </Callout>
                    </Marker>
                </MapView>
            </View>
        );
    }

    calloutPress() {
        console.log("hello!");
    }
}

const region = {
    latitude: 54.403664,
    longitude: 14.769657,
    latitudeDelta: 30,
    longitudeDelta: 30
};

const markerCoordinate = { latitude: 54.403664, longitude: 14.769657 };

const styles = StyleSheet.create({
    mapContainer: {
        width: "100%",
        height: "100%",
        zIndex: 0
    },
    map: {
        flex: 1
    },
    calloutTitle: {
        fontSize: 17,
        marginBottom: 5,
        fontWeight: "bold"
    },
    calloutDescription: {
        fontSize: 14
    }
});

【问题讨论】:

    标签: ios react-native react-native-maps


    【解决方案1】:

    经过一些额外的研究,我发现了这个未解决的问题https://github.com/react-native-community/react-native-maps/issues/2223

    问题指出,在 MapView 上使用 provider={PROVIDER_GOOGLE} 和自定义样式会使 onCalloutPress 不会在 IOS 上触发。使用本机提供程序时会触发。

    显然,标注上有一个 onPress 事件,使用它也可以在 IOS 上运行。这是使用 google 提供商在 android 和 ios 上工作的最终解决方案,它只在每个平台上触发一次:

    import React, { Component } from "react";
    import { View, StyleSheet, Text } from "react-native";
    import MapView, { Marker, Callout, PROVIDER_GOOGLE } from "react-native-maps";
    
    export default class MapTabs extends Component {
        constructor(props) {
            super(props);
        }
    
        render() {
            return (
                <View style={styles.mapContainer}>
                    <MapView
                        provider={PROVIDER_GOOGLE}
                        style={styles.map}
                        rotateEnabled={false}
                        mapType="standard"
                        initialRegion={region}
                    >
                        <Marker
                            coordinate={markerCoordinate}
                            onCalloutPress={() => this.calloutPress()}
                        >
                            <Callout onPress={() => this.calloutPress()}>
                                <View>
                                    <Text style={styles.calloutTitle}>My title</Text>
                                    <Text style={styles.calloutDescription}>My description</Text>
                                </View>
                            </Callout>
                        </Marker>
                    </MapView>
                </View>
            );
        }
    
        calloutPress() {
            console.log("hello!");
        }
    }
    
    const region = {
        latitude: 54.403664,
        longitude: 14.769657,
        latitudeDelta: 30,
        longitudeDelta: 30
    };
    
    const markerCoordinate = { latitude: 54.403664, longitude: 14.769657 };
    
    const styles = StyleSheet.create({
        mapContainer: {
            width: "100%",
            height: "100%",
            zIndex: 0
        },
        map: {
            flex: 1
        },
        calloutTitle: {
            fontSize: 17,
            marginBottom: 5,
            fontWeight: "bold"
        },
        calloutDescription: {
            fontSize: 14
        }
    });
    

    如果您不想添加未触发的事件侦听器,请使 onPress 和 onCalloutPress 平台依赖。

    【讨论】:

      【解决方案2】:

      您可以使用MapView.Callout

      你能试试这个吗?

      export default class MapTabs extends Component {
          constructor(props) {
              super(props);
          }
      
          calloutPress() {
              console.log("hello!");
          }
      
        render() {
          return (
            <View style={styles.mapContainer}>
              <MapView
                provider={PROVIDER_GOOGLE}
                style={styles.map}
                rotateEnabled={false}
                mapType="standard"
                initialRegion={region}
              >
                <MapView.Marker
                  coordinate={markerCoordinate}
                >
                  <MapView.Callout>
                    <TouchableOpacity
                      onPress={() => this.calloutPress()}
                    >
                       <Text style={styles.calloutTitle}>My title</Text>
                       <Text style={styles.calloutDescription}>My description</Text>
                    </TouchableOpacity>
                  </MapView.Callout>
                </MapView.Marker>
              </MapView>
            </View>
          );
        }
      }
      

      【讨论】:

      • 这与我在应用程序中其他任何地方使用的函数绑定相同,而且效果很好。试过了,但没有区别。
      • MapView.Callout 和我一样从 react-native-maps 导入时的 Callout 完全一样。也试过这个,但仍然没有运气。
      • 我知道,但这可能因版本而异。你可以试试MapView.Marker 吗?
      • 喜欢我更新的答案。这些尝试可以为您提供解决方案。
      • 你的 react-native-maps 版本是多少?
      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2021-01-01
      • 2019-02-28
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多