如何获取谷歌地图标记的 UIView 实例?

Posted

技术标签:

【中文标题】如何获取谷歌地图标记的 UIView 实例?【英文标题】:How to get the UIView instance for a Google Map marker? 【发布时间】:2016-09-09 16:34:35 【问题描述】:

我想在用户点击 Google 地图上的一个标记时将 VC 显示为弹出窗口。

我想这样做的原因是因为我想控制点击标记时弹出的视图。我尝试使用 mapView(mapView: GMSMapView, markerInfoWindow marker: GMSMarker) 委托方法。但我不知道如何在该方法中创建一个视图控制器来控制标记信息窗口的视图。

为了将 VC 呈现为弹出窗口,我这样做了:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("MarkerInfoController")
vc.modalInPopover = true
vc.modalPresentationStyle = .Popover
print(marker.iconView)
vc.popoverPresentationController!.sourceView = marker.iconView

self.presentVC(vc) // this is from EZSwiftExtensions. Don't worry about it

当我尝试设置sourceViewUIPopoverPresentationController 时出现问题。我认为使用 iconView 属性会起作用,但不是。总是报错说sourceView没有设置。

如何获取标记的UIView 实例,以便将其分配给sourceView

附:这就是创建标记的方式:

func mapView(mapView: GMSMapView, didLongPressAtCoordinate coordinate: CLLocationCoordinate2D) 
    let marker = GMSMarker(position: coordinate)
    marker.map = mapView

【问题讨论】:

【参考方案1】:

输出:

代码:

import UIKit
import GoogleMaps

class MapViewController: UIViewController 
  
  @IBOutlet weak var mapView: GMSMapView!
  var sourceView: UIView?


extension MapViewController: GMSMapViewDelegate 
  
  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool 
    mapCenterPinImage.fadeOut(0.25)
    
    // Adding a delay becuase when click on marker Camera changes it position
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) 
      
      let location = marker.accessibilityActivationPoint
      self.sourceView = UIView(frame: CGRect(x: location.x, y: location.y, width: 1, height: 1))
      self.view.addSubview(self.sourceView!)
    
      let popController = MyPopUpViewController()
      popController.modalPresentationStyle = UIModalPresentationStyle.popover
      popController.preferredContentSize = CGSize(width: 200, height: 200)
      popController.popoverPresentationController?.delegate = self
      popController.popoverPresentationController?.sourceView = self.sourceView
      self.present(popController, animated: true)
    

    return false
  
  

extension MapViewController: UIPopoverPresentationControllerDelegate
  func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle 
    return .none
  
  func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool 
    sourceView?.removeFromSuperview()
    sourceView = nil
    return true
  
  

我所做的基本上是创建了一个 UIView 并在运行时将其添加到 ViewController 并将其设置为 Popup 的源并在它被解除时使其为零。 ma​​rker.accessibilityActivationPoint是根据设备屏幕的X和Y来源

【讨论】:

【参考方案2】:

您可以只自定义 GMS Marker 的 infoView 而不是显示 viewControlle 并在那里执行您想要的操作。你可以在这里查看这篇文章。我遇到了与您的问题类似的问题,这帮助了我。希望它也能帮助你。 :D

https://medium.com/@matschmidy/how-to-implement-custom-and-dynamic-map-marker-info-windows-for-google-maps-ios-e9d993ef46d4

【讨论】:

【参考方案3】:

您可以在下面执行此操作是 gmsMapView 委托方法

 func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool 

在这里你会得到你点击的标记,你可以访问源视图

 marker.iconView 

我认为可以解决您的问题,希望对您有所帮助:)

【讨论】:

以上是关于如何获取谷歌地图标记的 UIView 实例?的主要内容,如果未能解决你的问题,请参考以下文章

在 android 谷歌地图中更改集群管理器项目图标

如何在谷歌地图上放置图标标记,图标数量是不是有配额?

如何更改谷歌地图标记上的图标

谷歌地图默认图标

如何在谷歌地图的标记中添加多个位图图标?

如何在谷歌地图的集群中为标记设置我自己的图标