1

我有一个带有一个标记的静态地图,并且希望始终显示标记标注。

有些人建议使用MapView's onLayout,但这在一段时间内不起作用。

我正在尝试解决onRegionChangeComplete有时有效的问题(它会被调用一次或两次),但在大约 10% 的情况下,它会陷入循环并一次又一次地被调用,直到应用程序崩溃。这仅在 iOS 上发生。

这是我的代码

setMarkerRef = (ref) => {
  this.marker = ref
}

showCallout = () => {
  this.marker.showCallout()
}

render() {

...

  <MapView
    style={{...StyleSheet.absoluteFillObject}}
    region={{
      latitude: latitude,
      longitude: longitude,
      latitudeDelta: 0.00922,
      longitudeDelta: 0.00421,
    }}
    showsMyLocationButton={false}
    showsCompass={false}
    showsTraffic={false}
    zoomEnabled={false}
    rotateEnabled={false}
    scrollEnabled={false}
    pitchEnabled={false}
    onRegionChangeComplete={this.showCallout}
    onPress={this.openMap}
  >
    <MapView.Marker
      coordinate={{
        latitude: latitude,
        longitude: longitude,
      }}
      title={address}
      ref={this.setMarkerRef}
    />
  </MapView>

知道我的方法有什么问题吗?有没有人有更好的解决方法?

编辑:我希望组件看起来像这样,而不需要用户交互。只需显示地图、标记和标注。

地图画面

4

1 回答 1

3

由于您正在渲染一个没有预期区域更改的固定地图,因此您无需收听regionChangeComplete. 这真的不是一个有趣的事件,因为它的行为不是那么一致。

initialRegion将用于显示您的地图。或者,如果您想要更多花哨的动画,请尝试使用MapView animateToRegion.

无论如何,你需要听的是componentDidMount

我怀疑您的参考代码可能是错误的,但无论如何这对我有用。

componentDidMount () {
  this.refs['mymarker'].showCallout()
}

render () {
  return (
    <MapView>
      <MapView.Marker
        coordinate={YOUR_COORDINATES}
        title='my callout'
        ref='mymarker'>
      </MapView.Marker>
    </MapView>
  )
}

如果您仍然有问题,可能是您的titleprop inMapView.Marker没有收到您在被调用address时传入的内容。showCallout在这种情况下,调用不会呈现。

更新的答案:(似乎上述不适用于Apple Maps)

render () {
  return (
    <MapView
      onLayout={() => this.refs["mymarker"].showCallout()}>
      <MapView.Marker
        coordinate={YOUR_COORDINATES}
        title='my callout'
        ref='mymarker'>
      </MapView.Marker>
    </MapView>
  )
}
于 2017-05-12T12:19:36.867 回答