【问题标题】:Google Maps different marker images for tapped and unselected stateGoogle Maps 为点击和未选择状态绘制不同的标记图像
【发布时间】:2020-05-09 05:32:11
【问题描述】:

有没有办法添加一个 ID、一个案例或类似的东西,以便为选中和未选中状态设置自定义标记图像?

我有多个具有不同名称/标题的标记,我需要特定类型的标记具有另一个用于选中和未选中状态的图像。

例如:

marker1 - marker_1_image

marker2 - marker_2_image

Atm 我只能使用正确的图像设置 2 个图像,但是如果我单击标记,它将继承在“.contains”函数上设置的特定类型。 我做了一个“.contains”函数,以便在 POI/位置名称下的 JSON 响应中查找特定字符串。例如:currentAtmModel?.placeName?.contains("restaurant"),因此名称为“restaurant”的标记将与特定的图标图像一起显示。

我正在使用最新版本的 iOS 版 Google Maps SDK。

这是我的代码:

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
    }
}

【问题讨论】:

  • 我想你想给标记分配一个唯一的标识符来识别被点击的标记?
  • @HardikS 是正确的,我该如何解决这个问题?
  • 请检查我的回答,如果您有任何问题,请告诉我。

标签: ios swift google-maps swift4 google-maps-sdk-ios


【解决方案1】:

当您将标记添加到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方法中的marker中获取marker唯一标识符,以设置不同的图像或基于marker执行其他操作

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
    }
}

希望这对你有帮助。

【讨论】:

  • 一件事,你知道如何在 GMaps 中设置一个半径,当相机离开该半径时,将使用更新后的坐标调用 API 调用?
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多