swift 4 Google Map - как обновить положение маркера с помощью жеста - PullRequest
0 голосов
/ 03 мая 2018

В viewDidLoad я добавил gesturerecognizers к mapView, а также установил значение consumeGestureInView и в методе handleTap я конвертирую точку касания в latLng, а затем устанавливаю позицию маркера с помощью latLng, но маркер движется очень медленно

self.mapView.settings.consumesGesturesInView = true
for gestureRecognizer in self.mapView.gestureRecognizers! {
                                gestureRecognizer.addTarget(self, action: #selector(MapViewController.handleTap(_:)))
}

      @objc func handleTap(_ sender: UITapGestureRecognizer) {
                var allMarkers = markers
                if(sender.numberOfTouches == 1){
                    var positions = CGPoint()
                    var newPosition = CLLocationCoordinate2D()
                    let currentZoom = self.mapView.camera.zoom

                    switch (sender.state){
                    case .began:
                        positions = sender.location(in: self.mapView)
                        newPosition = self.mapView.projection.coordinate(for: positions)
                        let ind = self.getNearbymarkers(position: newPosition,markers:allMarkers)
                        allMarkers[ind].position = newPosition
                        self.mapView.settings.scrollGestures = false
                        mapView(self.mapView, didBeginDragging: allMarkers[ind])
                        self.mapView.settings.scrollGestures = true
                        break
                    case .ended:
                        positions = sender.location(in: self.mapView)
                        newPosition = self.mapView.projection.coordinate(for: positions)
                        let ind = self.getNearbymarkers(position: newPosition,markers:allMarkers)
                        print(ind)
                        allMarkers[ind].position = newPosition
                        self.mapView.settings.scrollGestures = false
                        mapView(self.mapView, didEndDragging: allMarkers[ind])
                        self.mapView.settings.scrollGestures = true
                        break
                    case .changed:
                        positions = sender.location(in: self.mapView)
                        newPosition = self.mapView.projection.coordinate(for: positions)
                        let ind = self.getNearbymarkers(position: newPosition,markers:allMarkers)
                        print(ind)
                        allMarkers[ind].position = newPosition
                        self.mapView.settings.scrollGestures = false
                        mapView(self.mapView, didDrag: allMarkers[ind])
                        self.mapView.settings.scrollGestures = true
                        break
                    default:
                        break
                    }
            }
        }

Проблема в том, что когда эта строка выполняется, маркер отображается медленно allMarkers[ind].position = newPosition как мой палец двигается быстро, тогда маркер выглядит как движение за пальцем

1 Ответ

0 голосов
/ 04 мая 2018

Что касается моего опыта, то в GM нет простых встроенных решений для этого. К сожалению, единственное интерактивное событие, которое GMSMarker объекты позволяют вам отслеживать (почти без задержек), - это простое нажатие, которое вызывает соответствующий обратный вызов в делегате mapView. Если вы хотите что-то более сложное, вам нужно реализовать что-то с вашим собственным пользовательским представлением маркера, расположенным над картой, при выполнении операции перетаскивания. Вот алгоритм:

1) Добавьте UIPanGestureRecognizer к mapView. Установите его делегат для разрешения конфликтов с помощью встроенных в MapView gestRecognizer.

2) Когда вы начинаете панорамирование, в gestureRecognizerShouldBegin решите, применяет ли пользователь панорамирование к карте или к маркеру. Если маркер, позвольте panGR стрелять (return true).

3) Скрыть GMSMarker объект, который вы хотите переместить (установите непрозрачность на ноль или просто удалите с карты)

4) Вставьте свой собственный независимый MarkerView (который визуально дублирует удаленный на шаге 3) под положение пальца

5) Переместите этот пользовательский вид с обновлениями panGR.

6) При отпускании пальца замените пользовательский MarkerView на GMSMarkerView на последнем месте пальца, чтобы прикрепить карту обратно.

...