Как переместить маркер вместе с перемещением Карты Google в iOS?

Я показываю маркер в определенном месте, а также отображение текущего адреса в адресной метке на картах Google.

теперь я хочу изменить местоположение, переместив карту 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)
    }
}

4 ответов


// 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)
        }
    }

есть один трюк, который может помочь вам здесь. Вместо использования 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);

Теперь вы можете получить адрес местоположения с помощью API геокодирования google.

вот ссылка : https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_geocoder

вы можете обновить адрес, когда этот метод делегата вызывается :

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

надеюсь, что это помогает.


обновление для Swift 4:

сначала вам нужно соответствовать GMSMapViewDelegate:

extension MapsVC: GMSMapViewDelegate{

а затем установите VC в качестве делегата viewMap в viewDidLoad ()

viewMap.delegate = self

после этого вам просто нужно использовать следующий метод, чтобы получить обновления из положения камеры и установить это в качестве новой позиции для маркера:

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

с Заметки сделано в Maps SDK для IOS, изменение положения маркеров приведет к анимации маркера в новое место.

чтобы решить эту проблему, вы можете использовать новые функции для GMSMarker, как указано в Версия 1.5, например:

  • маркеры можно сделать перетаскиваемыми с помощью свойства draggable, и новые методы делегата перетаскивания были добавлены в GMSMapViewDelegate. (Вопрос 4975)
  • добавлен GMSMarkerLayer, a пользовательский подкласс CALayer для GMSMarker, который поддерживает анимацию положения и вращения маркера. (Выпуск 4951, Выпуск 5743)

В дополнение к этому, этот пост в GitHub - GoogleMapsAnimationGlitch и это так пост -как плавно перемещать GMSMarker по координатам в Objective C может также помочь.