iOS - Google Maps Размещает конфликты при клике с картой по клику - PullRequest
0 голосов
/ 12 мая 2018

У меня есть проект, созданный с помощью ionic. Здесь у меня есть карта Google с окном поиска мест.

Я включил библиотеку Google Map следующим образом:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=SOMEKEY&libraries=places" defer></script>

Теперь в моем коде TypeScript у меня есть следующее

// init the google map
initMap() {
    var centerOfMap;
    var draggableMarker = false;
    this.mapHasBeenInitialized = true;


    this.isStaticLocation = false;
    centerOfMap = new google.maps.LatLng(this.locationService.gpsLat, this.locationService.gpsLong);
    draggableMarker = true;

    var options = {
        center: centerOfMap,
        zoom: 11,
        fullscreenControl: false,
        disableDefaultUI: true, // dont allow default zoom/sattelite/street view
        gestureHandline: 'cooperative' // disable moving map with one finger
    };

    this.map = new google.maps.Map(this.googleMap.nativeElement, options);
    this.marker = new google.maps.Marker({
        position: centerOfMap,
        map: this.map,
        draggable: draggableMarker
    });

    if(!this.isStaticLocation) {
        var searchBox = new google.maps.places.SearchBox(this.googleInput.nativeElement);
        // add the searchbar to the google map
        this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(this.googleInput.nativeElement);

        // Bias the SearchBox results towards current map's viewport
        this.map.addListener('bounds-changed', () => {
            searchBox.setBounds(this.map.getBounds());
        });

        searchBox.addListener('places_changed', () => {
            var places = searchBox.getPlaces();

            if(places.length == 0) {
                return;
            }

            var bounds = new google.maps.LatLngBounds();
            places.forEach(place => {
                if(!place.geometry) {
                    console.log("returned place contains no geometry");
                    return;
                }
                this.setMarkerLocation(place);

                if(place.geometry.viewport) {
                    bounds.union(place.geometry.viewport);
                } else {
                    bounds.extends(place.geometry.location);
                }
            });            
            this.map.fitBounds(bounds);
        });
    }

    if(draggableMarker) {
        google.maps.event.addListener(this.marker, 'dragend', (event)=>{
            this.getMarkerLocation();
        });    
    }

    google.maps.event.addListener(this.map, 'click', (event: any)=> {
        var clickedLocation = event.latLng;
        this.marker.setPosition(clickedLocation);
        this.getMarkerLocation();
    });

    // neccessary for reload. Made async to trick loading process
    setTimeout(()=> {
        google.maps.event.trigger(this.googleMap.nativeElement, 'resize');
        this.map.setCenter(centerOfMap);
    }, 100);
}

// function to set the location marker on a different spot
setMarkerLocation(place: any) {
    this.marker.setMap(null);
    this.marker = new google.maps.Marker({
        position: place.geometry.location,
        map: this.map,
        draggable: true
    });
    this.getMarkerLocation();
}

getMarkerLocation() {
    var currLoc = this.marker.getPosition();
    this.locationService.setGoogleMapsLocation(currLoc.lat(), currLoc.lng());
    this.locationChanged = true;
}    

И этот код работает как брелок в браузере и на Android. По сути, этот код заключается в том, что всякий раз, когда кто-то нажимает на карту, положение маркера меняется на его местоположение касания.

Когда человек ищет место, над картой будет отображаться выпадающий список мест. На Android, когда вы нажимаете на место в этом выпадающем списке, маркер переместится в выбранное место (например, в Австралию).

Однако в iOS маркер будет располагаться в том месте, где постучал человек, и будет полностью игнорировать касание в раскрывающемся списке.

Поэтому, когда я нахожусь в Европе и набираю «Австралия» и выбираю «Австралия» в раскрывающемся списке, на Android я отправляюсь в Австралию, но на iOS я останусь где-нибудь в Европе, где бы ни располагался раскрывающийся список.

...