Google Maps различные изображения маркера для постукивающего и невыбранного состояния - PullRequest
1 голос
/ 23 января 2020

Есть ли способ добавить идентификатор, случай или что-то подобное, чтобы установить пользовательские изображения маркеров для выбранного и невыбранного состояния?

У меня есть несколько маркеров с разными именами / заголовками, и мне нужно что указанный тип маркера c имеет другое изображение для выбранного и невыбранного состояния.

Например:

marker1 - marker_1_image

marker2 - marker_2_image

Atm Я могу установить только 2 изображения с правильными изображениями, но если я нажму на маркер, он будет наследовать специфицированный тип c, установленный в функции ".contains". Я сделал функцию «.contains», чтобы найти указанную строку c в ответе JSON под именем POI / местоположения. Например: currentAtmModel? .placeName? .contains ("restaurant"), поэтому маркеры с названием "restaurant" будут отображаться с указанным c изображением значка.

Я использую последнюю версию Google Карты SDK для iOS.

Вот мой код:

var markersModel: [MarkersLocation] = [] {
        didSet {
            updateAllMarkers()
        }
    }

private func updateAllMarkers() {
        for selectedPOIMarker in markersModel {
            let currentPOIModel = selectedPOIMarker.location
            let latitude = currentPOIModel?.coordinates?.latitude
            let longitude = currentPOIModel?.coordinates?.longitude

            let marker = GMSMarker()
            marker.appearAnimation = GMSMarkerAnimation.pop
            marker.position = CLLocationCoordinate2D(latitude: latitude ?? 0, longitude: longitude ?? 0)

            if (currentPOIModel?.placeName?.contains("db")) ?? false {
                marker.icon = restaurantMarkerIcon(selected: false)
            } else {
                marker.icon = normalMarkerIcon(selected: false)
            }
            marker.map = googleMapsView
        }
    }

extension POILocatorViewController: GMSMapViewDelegate {
    func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
        googleMapsView.selectedMarker = marker
        googleMapsView.animate(toLocation: marker.position)
        googleMapsView.selectedMarker?.icon = normalMarkerIcon(selected: true)
        googleMapsView.selectedMarker?.icon = restaurantMarkerIcon(selected: true)
        guard let markersModel = markersModel.filter({ $0.location?.coordinates?.latitude == marker.position.latitude && $0.location?.coordinates?.longitude == marker.position.longitude }).first else { return false }
        coordinatorDelegate?.poiLocatorViewController(self, didTap: markersModel, currentLocation: currentLocation)

        return true
    }
}

extension POILocatorViewController {
    func reloadMarker() {
        googleMapsView.selectedMarker?.icon = normalMarkerIcon(selected: false)
        googleMapsView.selectedMarker?.icon = restaurantMarkerIcon(selected: false)
        googleMapsView.selectedMarker = nil
    }
}

1 Ответ

3 голосов
/ 23 января 2020

Когда вы добавите маркер к GMSMapView, вы можете назначить уникальный идентификатор для GMSMarker, используя его свойство zIndex для идентификации маркера.

 let marker = GMSMarker()
 marker.appearAnimation = GMSMarkerAnimation.pop
 marker.position = CLLocationCoordinate2D(latitude: latitude ?? 0, longitude: longitude ?? 0)

 if (currentPOIModel?.placeName?.contains("db")) ?? false {
     marker.icon = restaurantMarkerIcon(selected: false)
 } else {
     marker.icon = normalMarkerIcon(selected: false)
 }
 marker.zIndex = Int32(id) //your marker unique id
 marker.map = googleMapsView

И тогда вы можете получить маркер уникальный идентификатор в маркере в методе didTap для установки другого изображения или выполнения другой операции на основе маркера

extension POILocatorViewController: GMSMapViewDelegate {
    func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {

        print("Marker Identifier = \(marker.zIndex)") //Get your marker your unique identifier here.
        return true
    }
}

Надеюсь, это поможет вам.

...