如何获取 Google 地图标记的 UIView 实例?
How to get the UIView instance for a Google Map marker?
我想在用户点击 Google 地图上的标记之一时弹出 VC。
我之所以要这样做是因为我想控制点击标记时弹出的视图。我尝试使用 mapView(mapView: GMSMapView, markerInfoWindow marker: GMSMarker)
委托方法。但我不知道如何在控制标记信息 window 视图的方法中创建视图控制器。
为了将 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
当我尝试设置 UIPopoverPresentationController
的 sourceView
时出现问题。我认为使用 iconView
属性 会起作用,但不行。一直报错说sourceView
is not set.
如何获取标记的 UIView
实例,以便将其分配给 sourceView
?
P.S。这是创建标记的方式:
func mapView(mapView: GMSMapView, didLongPressAtCoordinate coordinate: CLLocationCoordinate2D) {
let marker = GMSMarker(position: coordinate)
marker.map = mapView
}
您可以只自定义 GMS 标记的 infoView 而不是显示 viewControlle 并在那里执行您想要的操作。你可以在这里看看这篇文章。我遇到了与您的问题类似的事情,这帮助了我。希望它也能帮助你。 :D
输出:
代码:
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 的源并在它被关闭时将其设为 nil。
marker.accessibilityActivationPoint 是根据设备屏幕的 X 和 Y 的来源
您可以在下面的 gmsMapView 委托方法中执行此操作
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool
在这里你会得到你点击的标记,对于源视图你可以访问
marker.iconView
我认为这会解决您的问题,希望对您有所帮助:)
我想在用户点击 Google 地图上的标记之一时弹出 VC。
我之所以要这样做是因为我想控制点击标记时弹出的视图。我尝试使用 mapView(mapView: GMSMapView, markerInfoWindow marker: GMSMarker)
委托方法。但我不知道如何在控制标记信息 window 视图的方法中创建视图控制器。
为了将 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
当我尝试设置 UIPopoverPresentationController
的 sourceView
时出现问题。我认为使用 iconView
属性 会起作用,但不行。一直报错说sourceView
is not set.
如何获取标记的 UIView
实例,以便将其分配给 sourceView
?
P.S。这是创建标记的方式:
func mapView(mapView: GMSMapView, didLongPressAtCoordinate coordinate: CLLocationCoordinate2D) {
let marker = GMSMarker(position: coordinate)
marker.map = mapView
}
您可以只自定义 GMS 标记的 infoView 而不是显示 viewControlle 并在那里执行您想要的操作。你可以在这里看看这篇文章。我遇到了与您的问题类似的事情,这帮助了我。希望它也能帮助你。 :D
输出:
代码:
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 的源并在它被关闭时将其设为 nil。 marker.accessibilityActivationPoint 是根据设备屏幕的 X 和 Y 的来源
您可以在下面的 gmsMapView 委托方法中执行此操作
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool
在这里你会得到你点击的标记,对于源视图你可以访问
marker.iconView
我认为这会解决您的问题,希望对您有所帮助:)