2017-05-12 12 views
0

하나의 마커가있는 정적지도가 있고 항상 마커 콜 아웃을 표시하려고합니다.에어 비앤비 맵에서 콜 아웃을 표시하는 방법은 무엇입니까?

일부 사용자는 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> 

어떤 생각인가? 누구든지 더 나은 해결 방법이 있습니까?

편집 : 구성 요소가 사용자 상호 작용없이 이처럼 보이길 원합니다. 지도, 마커 및 콜 아웃을 표시하기 만하면됩니다.

당신이 어떤 목적으로 지역의 변화에 ​​고정 된 맵을 렌더링하고 있기 때문에

map screen

+0

을 당신이 뭘 하려는지 완전히 확실하지 않다 (위의 애플지도를 위해 작동하지 않는 것처럼 보였다). 좀 더 설명해 주시겠습니까? 항상 표시되는지도의 중심에 고정 된 설명 선을 렌더링하려고합니까? –

+0

안녕하세요, @ KaiwenHuang 내 질문에 그림을 추가했습니다. 나는 사용자가지도와 상호 작용하고, 콜 아웃이 이미 열려있는 상태로지도에 표시해야하는 것을 원하지 않습니다. –

+0

아. 따라서지도에는 스크롤 기능이 비활성화되어 있습니다. 따라서 위도와 경도를 업데이트 할 때마다 해당 좌표에서 표식 및 설명 선을 표시해야합니다. –

답변

1

, 당신은 regionChangeComplete을 청취 할 필요가 없습니다. 그것의 행동이 일관성이 없기 때문에 정말로 재미있는 일이 아닙니다.

initialRegion지도를 표시하는 데 적합합니다. 또는 더 멋진 애니메이션을 원하면 MapViewanimateToRegion을 사용해보십시오.

어쨌든 듣고 싶은 것은 componentDidMount입니다.

refs 코드가 잘못되었을 것으로 의심되지만 어쨌든이 기능은 저에게 유용합니다.

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

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

그래도 문제가 있다면, 그것은 MapView.Markertitle 소품이 수신되지 않도록 할 수있는 address 당신이 showCallout가 호출 될 때 전달됩니다. 이 경우 콜 아웃은 렌더링되지 않습니다.

업데이트 답변 :

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

당신의 대답에 대해 Kaiwen 대단히 감사합니다. 불행히도 내 편에서는 코드가 작동하지 않습니다. 지도 및 표식이 렌더링되고 설명 선이 렌더링되지 않습니다. 나는 반응 네이티브 - 맵 0.15.0과 반응 네이티브 0.42.3을 사용하고 있습니다. iOS 10.3의 Apple지도로 테스트하기. 도움이된다면 전체 컴포넌트 코드를 공유 할 수 있습니다. –

+1

그래, 내 코드가 Google지도에서 작동하지만 콜 아웃이 Apple지도에 표시되지 않는지 테스트했습니다.하지만 componentDidMount 대신 onLayout을 수신하도록 변경 한 후에는 Google지도와 Apple지도에서 모두 작동합니다. 대답을 업데이트하면 업데이트 된 답변과 함께 작동하는지 확인할 수 있습니다. 그렇지 않으면 전체 구성 요소를 표시하십시오. –

+0

안녕하세요! 나는 이것을 더 일찍 확인할 수 없었다. 귀하의 솔루션은 여전히 ​​내 테스트에서 올바르게 작동하지 않습니다. 이것은 내 구성 요소 코드입니다 (귀하의 답변에 따라 변경됨) : https://pastebin.com/0S1fncCC. 지도는 렌더링하는 동안 장소를 뛰어 넘기 시작합니다. –