2017-05-12 3 views
0

Ich habe eine statische Karte mit einem Marker und möchte immer das Marker-Callout anzeigen.Wie zeige ich Callouts in Airbnb-Karten an?

Einige Leute raten, 's onLayout zu verwenden, aber das funktioniert seit einiger Zeit nicht mehr.

Ich versuche es mit onRegionChangeComplete zu lösen, was manchmal funktioniert (es wird einmal oder zweimal aufgerufen), aber in etwa 10% Fällen bleibt es in einer Schleife stecken und wird immer wieder aufgerufen, bis die App abstürzt. Dies geschieht nur unter iOS.

Dies ist mein Code

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> 

Jede Idee, was mit meinem Ansatz falsch? Hat jemand einen besseren Workaround?

Edit: Ich möchte die Komponente so aussehen, ohne die Benutzerinteraktion. Zeigen Sie einfach eine Karte, eine Markierung und ein Callout an.

map screen

+0

Ich bin mir nicht ganz sicher, was Sie zu tun versuchen. Könntest du ein bisschen mehr erklären? Versuchen Sie, einen Callout zu rendern, der ständig in der Mitte der Karte angezeigt wird? –

+0

Hallo, @KaiwenHuang Ich habe meiner Frage ein Bild hinzugefügt. Ich möchte nicht, dass der Benutzer mit der Karte interagieren muss, sondern zeige sie ihnen nur an, wenn das Callout bereits geöffnet ist. –

+0

Ah. Ihre Karte ist also ebenfalls deaktiviert. Also, wann immer Sie Ihren Breiten- und Längengrad aktualisieren, wollen Sie, dass der Marker und das Callout an dieser Koordinate angezeigt werden, habe ich recht? –

Antwort

1

Da Sie ohne beabsichtigte Region Änderung eine feste Karte rendern, gibt es keine Notwendigkeit für Sie zu regionChangeComplete hört. Es ist wirklich kein Spaß, mit ihm zu arbeiten, da sein Verhalten nicht so konsistent ist.

würde funktionieren, um Ihre Karte zu zeigen. Oder wenn Sie eine ausgefallenere Animation wünschen, versuchen Sie es mit animateToRegion.

Wie auch immer, alles, was Sie hören müssen, ist componentDidMount.

Ich vermute, dass Ihr Refs-Code falsch sein könnte, aber das funktioniert für mich.

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

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

Wenn Sie immer noch Probleme haben, könnte es sein, dass Ihre title Stütze in MapView.Marker wird nicht mit dem address Sie vorbei in, wenn showCallout aufgerufen wurde. In diesem Fall wird der Aufruf nicht ausgeführt.

Aktualisiert Antwort: (schien wie die oben nicht für Apple Maps Arbeiten wurde)

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

Kaiwen vielen Dank für Ihre Antwort. Leider funktioniert dein Code nicht auf meiner Seite. Die Karte und der Marker werden gerendert, das Callout nicht. Ich benutze react-native 0.42.3 mit react-native-maps 0.15.0. Testen mit Apple Maps auf iOS 10.3. Ich kann den gesamten Komponentencode teilen, wenn es hilft. –

+1

Okay, ich habe getestet, dass mein Code auf Google Maps funktioniert, aber das Callout wird nicht in Apple Maps angezeigt.Aber nachdem ich es geändert habe, um onLayout statt componentDidMount anzuhören, funktioniert es sowohl auf GoogleMaps als auch auf Apple Maps. Lassen Sie mich die Antwort aktualisieren und Sie sehen, ob es mit der aktualisierten Antwort funktioniert. Ansonsten zeigen Sie Ihre gesamte Komponente –

+0

Hallo! Ich konnte das nicht früher überprüfen. Ihre Lösung funktioniert in meinen Tests immer noch nicht korrekt. Dies ist mein Komponentencode (geändert nach Ihrer Antwort): https://pastebin.com/0S1fncCC. Die Karte springt beim Rendern um den Platz herum. –

Verwandte Themen