How do I move marker along with moving of Google Map in iOS?

前端 未结 4 1864
一个人的身影
一个人的身影 2020-12-24 15:37

I am displaying a marker in a particular place, along with displaying the current address in the address label on Google Maps.

Now, I want to change the location by

相关标签:
4条回答
  • 2020-12-24 15:59

    Based from Release Notes made in Maps SDK for IOS, changing a markers position will cause the marker to animate to the new location.

    To resolve this, you may use new features for GMSMarker as stated in Release Version 1.5 such as:

    • Markers can be made draggable using the draggable property, and new drag delegate methods have been added to GMSMapViewDelegate. (Issue 4975)
    • Added GMSMarkerLayer, a custom CALayer subclass for GMSMarker that supports animation of marker position and rotation. (Issue 4951, Issue 5743)

    In addition to that, this post in GitHub - GoogleMapsAnimationGlitch and this SO post - How to smoothly move GMSMarker along coordinates in Objective c might also help.

    0 讨论(0)
  • 2020-12-24 16:05
    // 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)
            }
        }
    
    0 讨论(0)
  • 2020-12-24 16:11

    Update for Swift 4:

    First you need to conform with the GMSMapViewDelegate:

    extension MapsVC: GMSMapViewDelegate{
    

    And then set your VC as the delegate of viewMap in the viewDidLoad()

    viewMap.delegate = self
    

    After that you just need to use the following method to get updates from the camera position and set that as the new position for the marker:

    func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
        destinationMarker.position = position.target
        print(destinationMarker.position)
    }
    
    0 讨论(0)
  • 2020-12-24 16:11

    There is one trick that can help you out here. Instead of using a GMSMarker here, put an image pointing to the center, over your Google MapView.

    You can easily find the coordinates of Map's center using this :

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

    Or this

    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);
    

    Now you can get the location address by using Geocoding API by google.

    Here is the reference : https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_geocoder

    You can refresh Address when this delegate method is called :

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

    Hope this helps.

    0 讨论(0)
提交回复
热议问题