【问题标题】:How to show callout in Airbnb maps?如何在 Airbnb 地图中显示标注?
【发布时间】:2017-05-12 11:34:15
【问题描述】:

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

有些人建议使用MapViewonLayout,但这暂时不起作用。

我正在尝试使用 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>

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

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

【问题讨论】:

  • 我不完全确定您要做什么。你能再解释一下吗?您是否尝试渲染固定在地图中心且一直显示的标注?
  • 嗨,@KaiwenHuang 我已经在我的问题中添加了图片。我不希望用户必须与地图进行交互,只需在标注已打开的情况下向他们展示即可。
  • 啊。所以你的地图也禁用了滚动。因此,每当您更新纬度和经度时,您希望标记和标注显示在该坐标处,对吗?
  • 我什至不打算改变坐标。我使用了innitialRegion,但后来我感觉它使用region 效果更好。可能没关系。
  • 啊,我明白了。因此,只需在渲染此组件时显示带有标记和标注的固定地图。我会发布答案

标签: react-native react-native-maps


【解决方案1】:

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

initialRegion 可用于显示您的地图。或者,如果您想要更精美的动画,请尝试使用 MapView animateToRegion

不管怎样,你只需要听componentDidMount

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

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

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

如果您仍有问题,可能是您在 MapView.Marker 中的 title 属性没有收到您在调用 showCallout 时传入的 address。在这种情况下,调用不会呈现。

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

render () {
  return (
    <MapView
      onLayout={() => this.refs["mymarker"].showCallout()}>
      <MapView.Marker
        coordinate={YOUR_COORDINATES}
        title='my callout'
        ref='mymarker'>
      </MapView.Marker>
    </MapView>
  )
}

【讨论】:

  • 凯文非常感谢您的回答。不幸的是,您的代码对我不起作用。地图和标记被渲染,标注没有。我正在使用 react-native 0.42.3 和 react-native-maps 0.15.0。在 iOS 10.3 上使用 Apple 地图进行测试。如果有帮助,我可以分享整个组件代码。
  • 好的,我测试了我的代码可以在 GoogleMaps 上运行,但标注没有显示在 Apple Maps 上。但是在我将其更改为听 onLayout 而不是 componentDidMount 之后,它可以在 GoogleMaps 和 Apple Maps 上运行。让我更新答案,你看看它是否适用于更新的答案。否则,请显示您的整个组件
  • 嗨!我无法更早地检查这一点。您的解决方案在我的测试中仍然无法正常工作。这是我的组件代码(根据您的回答更改):pastebin.com/0S1fncCC。地图在渲染时开始在该地点周围跳跃。
  • 我认为问题不再在于如何显示标注,因为有很多事情可能出错,比如传递给 Map 组件的道具是什么,styles.mapView 是什么等。地图跳跃可能是由于传入的道具被更新等。您的渲染中的父 也没有定义样式。我可以建议您首先硬编码纬度、经度和地址的值。首先删除依赖项和逻辑。您的渲染函数应该只返回第 18 行到第 46 行的代码。尝试一下,看看标注是否有效。
猜你喜欢
  • 2021-01-25
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多