Swift - GMSMapView animate (toLocation :) / animate (to: CameraPositon) не работает - PullRequest
1 голос
/ 06 февраля 2020

Так я запускаю map - GMSMapView

class ViewController: UIViewController {
   var map = GMSMapView()

   override func viewDidLoad() {
       super.viewDidLoad()
       setupGoogleView()
   }

   private func setupGoogleView() {
       guard let coordinates = getUserLocation() else { return }
       let camera = GMSCameraPosition.camera(withLatitude: coordinates.latitude, longitude: coordinates.longitude, zoom: 16.0)
       self.map = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
       map.settings.tiltGestures = false
       map.mapType = .satellite
       map.delegate = self
       map.frame = view.frame
       self.view.addSubview(map)
   }
}

Проблема возникает, когда я вызываю эту функцию откуда-то еще в файле

private func animateTo(location: CLLocationCoordinate2D) {
    DispatchQueue.main.async {
        let cameraPosition = GMSCameraPosition(target: location, zoom: 20)
        self.map.animate(toLocation: location)
        self.map.animate(to: cameraPosition)
    }
}

Я пытаюсь переместить камеру по некоторым координатам, но ничего не происходит. Я пробовал каждое решение на stackoverflow и google.

У меня lat и lng в location - проверено. Функция вызывается - проверено.

Я также пытался self.view.layoutSubviews(), self.view.layoutIfNeeded(), а также для map

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Мне удается решить проблему с помощью:

self.view.subviews.forEach { (view) in
   if let mapView = view as? GMSMapView {
      // do update on mapView here
   }
}
0 голосов
/ 06 февраля 2020

попробуйте использовать CLLocationManagerDelegate

// Handle authorization for the location manager.
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .restricted:
            print("Location access was restricted.")
        case .denied:
            print("User denied access to location.")
            // Display the map using the default location.
            mapView.isHidden = false
        case .notDetermined:
            print("Location status not determined.")
        case .authorizedAlways: fallthrough
        case .authorizedWhenInUse:
            print("Location status is OK.")
            getFilialList()
        @unknown default:
            fatalError()
        }
    }

затем

 // Handle incoming location events.
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location: CLLocation = locations.last!
        print("Location: \(location)")
        let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude,
                                              longitude: location.coordinate.longitude,
                                              zoom: 12)
        DispatchQueue.main.async {
            self.mapView.animate(to: camera)
            self.locationManager.stopUpdatingLocation()
        }
    }
...