我尝试使用简单的MapView并显示2个标记。
它们都正确显示在标测图视图上,但不能同时显示在屏幕上(默认渲染Image 1)
我必须执行手动拖动操作,然后才能在屏幕上看到两个标记。(手动拖动Map后的图像2,以便在屏幕上看到它们)
我尝试使用fitToSuppliedMarkers/fitToCoordinates,但似乎没有任何效果。
export default class FavItemMapView extends Component{
constructor(props){
super(props)
this.state={
position:{
latitude:1.286353,
longitude:103.853067,
latitudeDelta: 0,
longitudeDelta: 0,
},
error:null
}
this.mapRef = null;
}
componentWillMount(){
const favPlaceLatitude = parseFloat(this.props.navigation.state.params.latitude)
const favPlaceLongitude = parseFloat(this.props.navigation.state.params.longitude)
markers.push({latitude:favPlaceLatitude,longitude:favPlaceLongitude});
navigator.geolocation.getCurrentPosition(
(position) => {
console.log("wokeeey" + width + height);
console.log(position);
var lat = parseFloat(position.coords.latitude)
var long = parseFloat(position.coords.longitude)
var initialRegion = {
latitude: lat,
longitude: long,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
}
this.onRegionChange(initialRegion)
},
(error) => this.setState({ error: error.message }),
{ enableHighAccuracy: false, timeout: 200000, maximumAge: 1000 },
);
}
onRegionChange(region) {
this.setState({ position:region })
}
componentDidMount(){
//this.mapRef.fitToSuppliedMarkers(markerIDs,true);
const favPlaceLatitude = parseFloat(this.props.navigation.state.params.latitude)
const favPlaceLongitude = parseFloat(this.props.navigation.state.params.longitude)
this.mapRef.fitToCoordinates([{latitude:favPlaceLatitude,longitude:favPlaceLongitude}], {
edgePadding: {
bottom: 200, right: 50, top: 150, left: 50,
},
animated: true,
});
}
render(){
const { navigation } = this.props;
const favPlaceLatitude = parseFloat(navigation.state.params.latitude)
const favPlaceLongitude = parseFloat(navigation.state.params.longitude)
return(
<View style={styles.container}>
<MapView provider={MapView.PROVIDER_GOOGLE} ref={ref => {this.mapRef = ref;}} style={styles.map} region={this.state.position}>
{this.state.position.latitude &&
<MapView.Marker identifier="Marker2" coordinate={{latitude:this.state.position.latitude,longitude:this.state.position.longitude}} pinColor="red"/>
}
{this.state.position.longitude &&
<MapView.Marker identifier="Marker1" coordinate={{latitude:favPlaceLatitude,longitude:favPlaceLongitude}} pinColor="green"/>
}
</MapView>
</View>
);
}
}
const styles={
container:{
...StyleSheet.absoluteFillObject,
justifyContent: 'flex-end',
alignItems: 'center',
},
map:{
padding:100,
...StyleSheet.absoluteFillObject
}
}
你能有人建议什么是错的吗?附上模拟器图像供参考。x1c 0d1xx 1c 1d 1x
7条答案
按热度按时间2nbm6dog1#
de90aj5v2#
因此,根据我使用这个库的经验-我发现最好的经验是利用MapView组件上的
onMapReady
属性。https://github.com/react-native-community/react-native-maps/blob/master/docs/mapview.md#events
或
让我知道这是否有帮助,我还在学习它,但这种方法是假设您有现成的标记,您正在传递到您的Map组件渲染。
b4wnujal3#
在我看来,最好的方法是在iOS中使用
fitToElements
,在Android中使用fitToSuppliedMarkers
(或fitToCoordinates
),我的代码结果如下:des4xlb04#
这就是我如何将所有标记集中在react native中:
pobjuy325#
根据文档,对于方法
fitToSuppliedMarkers
:如果您需要在ComponentDidMount中使用此功能,请确保将其设置为超时,否则会导致性能问题。注意edgePadding仅适用于Google Maps
和
fitToCoordinates
:如果在android的ComponentDidMount中调用会导致异常,建议在MapView onLayout事件中调用。
这也会导致这些方法无法正确工作,如问题所示。
您需要使用计时器在短时间后调用该方法,以便它工作,如下所示:
vdzxcuhz6#
我认为在两个平台上使用fitToSuppliedMarkers最简单的方法是使用inuseEffect Hook沿着setInterval()
在我的情况下工作得很顺利!
检查示例,
源代码:
谢谢!查看完整的项目代码Here
4uqofj5v7#
你能检查一下缩放级别吗?Map视图有一个缩放属性可以帮助你。你也可以使用animateToCamera