如何在 iOS 中移动标记以及移动 Google 地图?

Posted

技术标签:

【中文标题】如何在 iOS 中移动标记以及移动 Google 地图?【英文标题】:How do I move marker along with moving of Google Map in iOS? 【发布时间】:2016-10-25 19:45:50 【问题描述】:

我在特定位置显示一个标记,同时在 Google 地图的地址标签中显示当前地址。

现在,我想通过移动谷歌地图来改变位置,但问题是当我移动地图时,我应该同时移动标记和地图,我应该在地址标签。

我该怎么做?

我试过了:

let destinationMarker = GMSMarker(position: self.destinationLocation.coordinate)

let image = UIImage(named:"sourcemarker")
destinationMarker.icon = image
destinationMarker.draggable = true
destinationMarker.map = self.viewMap
//viewMap.selectedMarker = destinationMarker
destinationMarker.title = "hi"
destinationMarker.userData = "changedestination"

func mapView(mapView: GMSMapView, didEndDraggingMarker marker: GMSMarker)

    if marker.userData as! String == "changedestination"
    
        self.destinationLocation = CLLocation(latitude: marker.position.latitude, longitude: marker.position.longitude)
        self.destinationCoordinate = self.destinationLocation.coordinate
        //getAddressFromLatLong(destinationCoordinate)
    

【问题讨论】:

【参考方案1】:
// UpdteLocationCoordinate
    func updateLocationoordinates(coordinates:CLLocationCoordinate2D) 
        if destinationMarker == nil
        
            destinationMarker = GMSMarker()
            destinationMarker.position = coordinates
            let image = UIImage(named:"destinationmarker")
            destinationMarker.icon = image
            destinationMarker.map = viewMap
            destinationMarker.appearAnimation = kGMSMarkerAnimationPop
        
        else
        
            CATransaction.begin()
            CATransaction.setAnimationDuration(1.0)
            destinationMarker.position =  coordinates
            CATransaction.commit()
        
    

    // Camera change Position this methods will call every time
    func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition) 
        let destinationLocation = CLLocation()
        if self.mapGesture == true
        
            destinationLocation = CLLocation(latitude: position.target.latitude,  longitude: position.target.longitude)
            destinationCoordinate = destinationLocation.coordinate
            updateLocationoordinates(destinationCoordinate)
        
    

【讨论】:

嘿,你能告诉我mapGesture的使用吗(如果self.mapGesture == true)我收到错误:-没有成员mapGesture【参考方案2】:

Swift 4 更新:

首先你需要符合GMSMapViewDelegate:

extension MapsVC: GMSMapViewDelegate

然后在viewDidLoad()中将你的VC设置为viewMap的代理

viewMap.delegate = self

之后,您只需使用以下方法从相机位置获取更新并将其设置为标记的新位置:

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) 
    destinationMarker.position = position.target
    print(destinationMarker.position)

【讨论】:

【参考方案3】:

这里有一个技巧可以帮助您。不要在此处使用 GMSMarker,而是在您的 Google MapView 上方放置一个指向中心的图像。

您可以使用以下方法轻松找到地图中心的坐标:

double latitude = mapView.camera.target.latitude;
double longitude = mapView.camera.target.longitude;

或者这个

GMSCoordinateBounds *bounds = nil;
bounds = [[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];

CLLocationCoordinate2D centre = CLLocationCoordinate2DMake(
                                                           (bounds.southWest.latitude + bounds.northEast.latitude) / 2,
                                                           (bounds.southWest.longitude + bounds.northEast.longitude) / 2);

现在您可以使用 Google 的 Geocoding API 获取位置地址。

这是参考: https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_geocoder

调用此委托方法时可以刷新地址:

- (void) mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position 

希望这会有所帮助。

【讨论】:

您的idleAtCameraPosition 小费拯救我的一天!【参考方案4】:

根据 Maps SDK for IOS 中的Release Notes,更改标记位置将导致标记动画到新位置。

要解决此问题,您可以使用 Release Version 1.5 中所述的 GMSMarker 新功能,例如:

可以使用 draggable 属性使标记可拖动,并且新的拖动委托方法已添加到 GMSMapViewDelegate。 (第 4975 期) 添加了 GMSMarkerLayer,它是 GMSMarker 的自定义 CALayer 子类,支持标记位置和旋转的动画。 (第 4951 期,第 5743 期)

除此之外,GitHub 上的这篇文章 - GoogleMapsAnimationGlitch 和这个 SO 帖子 - How to smoothly move GMSMarker along coordinates in Objective c 也可能有帮助。

【讨论】:

@Teyam.. 我有点怀疑。我正在使用谷歌地图。位置更新时,我的地图视图也会动画。请帮助我。

以上是关于如何在 iOS 中移动标记以及移动 Google 地图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Maps API 中移动标记

Google Maps Android API - 如何在拖动时移动标记的锚点

使用在 Firestore 中插入的 GeoPoint 在 Google 地图中移动标记

在Google Analytics中合并网络数据和移动数据

iOS 移动设备上的字体渲染问题

在谷歌地图v2 android中移动标记