【发布时间】:2018-07-25 17:10:47
【问题描述】:
当用户点击叠加层时,会触发以下代码:
func mapView(_ mapView: GMSMapView, didTap overlay: GMSOverlay) {
}
我想知道我们是否可以提取被点击的叠加层的确切 LAT 和 LONG 坐标?
谢谢!
【问题讨论】:
-
检查我的答案
当用户点击叠加层时,会触发以下代码:
func mapView(_ mapView: GMSMapView, didTap overlay: GMSOverlay) {
}
我想知道我们是否可以提取被点击的叠加层的确切 LAT 和 LONG 坐标?
谢谢!
【问题讨论】:
为了解决这个问题,我们需要两种方法一起使用, 所以我以一种我希望它对这个问题有所帮助的方式将它们结合起来:
func mapView(_ mapView: GMSMapView, didTap overlay: GMSOverlay) {
print(overlay)
}
func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
print(coordinate)
for polyline in polylines {
if GMSGeometryIsLocationOnPath(coordinate, polyline.path!, true) {
self.mapView(mapView, didTap: polyline)
}
}
for polygon in polygons {
if GMSGeometryContainsLocation(coordinate, polygon.path!, true) {
self.mapView(mapView, didTap: polygon)
}
}
}
如果用户点击coordinate我们会处理这个,然后检查这个coordinate是否包含在我们之前定义的任何Polyline或Polygon中,所以我们fire事件didTap overlay对于那个overlay。
确保polylines和polygonsisTappable = false
但请记住,即使是overlaped,每个overlay 都会触发此事件,您可以在if 成功时将return 放在第一个overlay 上
【讨论】:
您也可以使用 didTapAt 委托方法。
@wajih,当您点击地标名称或标题时,您是否调用了 didTapAt 方法?对我来说,它没有被调用。 在我的情况下,地标标题在多边形上方,并且没有调用 didTapAt 方法,但是如果我将 tappable 设置为 true,则可以完美调用 didTap(overlay)。
【讨论】:
如果您只想在无论是否在 Overlay 上点击的任何位置都获得准确的坐标,那么每当我们点击 GoogleMaps 时都会调用 GMSMapViewDelegate 的另一个代表。在此委托中,您可以获取您在地图上点击的确切坐标,而与点击叠加层无关。
Swift 3.0
func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
print(coordinate.latitude)
print(coordinate.longitude)
}
如果您只想在点击标记上获取坐标,请使用此委托方法
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
print(marker.position.latitude)
print(marker.position.longitude)
return true
}
确保您的叠加层不可点击
overlay.isTappable = false
参考见here
【讨论】:
overlay.isTappable = true。
GoogleMapsSDK 中没有任何方法可以在点击覆盖时为您提供准确的坐标。您只能收到点击叠加层的事件,但不会在点击叠加层时获得坐标,因为GMSOverlay 类没有坐标选项。
didTapAt 同时还监听覆盖点击?
overlay 设为可点击true,则永远不会调用didTapAt。
didTapAt 永远不会在您点击overlay 时被调用。当您在overlay外部点击时会调用它