Все попытки анимации движения маркера в Google Maps между координатами указывают на использование следующего фрагмента кода в Swift:
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
marker.position = coordindates
CATransaction.commit()
В качестве примера приведем сообщение SO с большинством голосов: Какдля плавного перемещения GMSMarker по координатам в Objective c
Это работает нормально при анимации между исходной и целевой парами координат.Тем не менее, я ищу анимацию от начальной координаты в GMSPath до конечной координаты.При итерации по точкам на пути единственная отображаемая анимация находится между двумя последними координатами.Маркер появляется только со второй до последней точки и анимируется до конечной точки.
Вот мой код для ViewController.Он получает сегмент маршрута как закодированный путь (для тестирования первый закодированный путь: «ika ~ Exi | vN | AaDzAyCTc @ N [lBeEvB_ExBkExBmEjBwDXo @»).
Код перебирает все сохраненные координаты внутри объекта GMSPath и пытается анимировать, используя приведенный выше фрагмент.Как уже говорилось, он показывает только анимацию между двумя последними точками.
Я попытался поместить все наборы кода в ViewDidLoad, ViewDidAppear и ViewWillAppear.ViewDidLoad сохранил уровень масштабирования на межконтинентальном уровне.ViewDidAppear и ViewWillAppear соответствующим образом увеличили масштаб и привели к проблемам с анимацией, упомянутым в этом посте.Код в настоящее время разделен между ViewDidAppear и ViewWillAppear, но будет действовать так же, если он размещен исключительно в любом из методов.
import UIKit
import GoogleMaps
import CoreLocation
class MapVC:UIViewController {
var mapView:GMSMapView?
var polyline:GMSPolyline?
var path:GMSPath?
var encodedPath:String? = nil
var marker:GMSMarker?
override func viewDidLoad() {
super.viewDidLoad()
setupMap()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if encodedPath != nil {
self.path = GMSPath(fromEncodedPath: encodedPath!)
self.polyline = GMSPolyline(path: path)
self.polyline!.map = self.mapView!
let bounds:GMSCoordinateBounds = GMSCoordinateBounds(path: path!)
let update = GMSCameraUpdate.fit(bounds, withPadding: 10.0)
self.mapView!.animate(with: update)
} else {
print("nil path")
}
let a=2
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
var index:UInt = 0
let count:UInt = self.path!.count()
if count > 0 {
marker = GMSMarker(position: self.path!.coordinate(at:index))
marker!.map = self.mapView
index += 1
while index < count {
CATransaction.begin()
CATransaction.setAnimationDuration(30)
self.marker!.position = self.path!.coordinate(at:index)
CATransaction.commit()
index += 1
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func setupMap() {
let camera = GMSCameraPosition.camera(withLatitude: 36.5, longitude: -82.5, zoom: 16)
mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
self.view = mapView
}
}