Swift - перемещение GMSMarker по массиву координат CLC из GMSPath (Google Maps SDK для iOS) - PullRequest
0 голосов
/ 12 октября 2018

Все попытки анимации движения маркера в 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

    }

}

1 Ответ

0 голосов
/ 13 октября 2018

Нашел решение с использованием таймера: https://github.com/antonyraphel/ARCarMovement/blob/master/ARCarMovementSwift/ARCarMovementSwift/ViewController.swift

Обновленный код из контроллера вида, показанного выше:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        marker = GMSMarker(position: self.path!.coordinate(at:self.index))
        marker!.map = self.mapView

        timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: 
                #selector(MapVC.timerTriggered), userInfo: nil, repeats: true)


    }


    @objc func timerTriggered() {

        if self.index < self.path!.count() {

            CATransaction.begin()
            CATransaction.setAnimationDuration(1.9)
            self.marker!.position = self.path!.coordinate(at:index)
            CATransaction.commit()
            self.index += 1

        } else {

            timer.invalidate()
            timer = nil

        }

    }
...