анимировать камеру в другую позицию показывает текущую позицию с Google Maps SDK - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть карты, чтобы показать текущее местоположение с помощью Google Maps SDK. настройки карты в этом коде

override func viewDidAppear(_ animated: Bool) {
    if CLLocationManager.locationServicesEnabled() {
        startMonitoringLocation()
        addCurrentLocationMarker()
    }
}

func startMonitoringLocation() {
    if CLLocationManager.locationServicesEnabled() {
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        locationManager.activityType = CLActivityType.automotiveNavigation
        locationManager.distanceFilter = 1
        locationManager.headingFilter = 1
        locationManager.requestWhenInUseAuthorization()
        locationManager.startMonitoringSignificantLocationChanges()
        locationManager.startUpdatingLocation()
    }
}

func stopMonitoringLocation() {
    locationManager.stopMonitoringSignificantLocationChanges()
    locationManager.stopUpdatingLocation()
}

func addCurrentLocationMarker() {
    currentLocationMarker?.map = nil
    currentLocationMarker = nil
    if let location = locationManager.location {
        currentLocationMarker = GMSMarker(position: location.coordinate)
        currentLocationMarker?.icon = #imageLiteral(resourceName: "Geolocalización")
        currentLocationMarker?.map = mapView
        currentLocationMarker?.rotation = locationManager.location?.course ?? 0
    }
}

func zoomToCoordinates(_ coordinates: CLLocationCoordinate2D) {
    let camera = GMSCameraPosition.camera(withLatitude: coordinates.latitude, longitude: coordinates.longitude, zoom: 14)
    mapView.camera = camera
}

//MARK:- Location Manager Delegate

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("location manager erroe -> \(error.localizedDescription)")
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        break
    case .restricted:
        break
    case .denied:
        stopMonitoringLocation()
        break
    default:
        addCurrentLocationMarker()
        startMonitoringLocation()
        break
    }
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("location update")
    if let lastLocation = locations.last {
        currentLocationMarker?.position = lastLocation.coordinate
        currentLocationMarker?.rotation = lastLocation.course
        self.zoomToCoordinates(lastLocation.coordinate)
        self.stopMonitoringLocation()
    }
}

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

        func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
//      print("Place name: \(place.name)")
//      print("Place address: \(place.formattedAddress)")
//      print("Place attributions: \(place.attributions)")
        if punto1{
            print("is text1")
            punto1Text.text = place.formattedAddress
            punto1Cordinate =  place.coordinate//place.viewport?.southWest
            let newMarker = GMSMarker(position: punto1Cordinate!)
            newMarker.icon = UIImage(named: "desde")
            newMarker.map = self.mapView
            self.mapView.animate(toLocation: punto1Cordinate!)
            self.mapView.camera = GMSCameraPosition.camera(withTarget: punto1Cordinate!, zoom: 14.0)
            //self.zoomToCoordinates(punto1Cordinate!)
            if punto2Cordinate != nil{
                self.drawPath(origin: "\(punto1Cordinate!.latitude),\(punto1Cordinate!.longitude)", destination: "\(punto2Cordinate!.latitude),\(punto2Cordinate!.longitude)")
                let mapsBound = GMSCoordinateBounds(coordinate: punto1Cordinate!, coordinate: punto2Cordinate!)
                //self.mapView.camera(for: mapsBound, insets: <#T##UIEdgeInsets#>)
                // self.mapView.cameraTargetBounds = mapsBound
                self.mapView.animate(with: GMSCameraUpdate.fit(mapsBound, withPadding: 120.0))
            }
        }else{
            print("is text2")
            punto2Text.text = place.formattedAddress
            punto2Cordinate = place.coordinate//viewport?.southWest
            let newMarker = GMSMarker(position: punto2Cordinate!)
            newMarker.icon = UIImage(named: "hasta")
            newMarker.map = self.mapView
            if punto1Cordinate != nil {
                self.drawPath(origin: "\(punto1Cordinate!.latitude),\(punto1Cordinate!.longitude)", destination: "\(punto2Cordinate!.latitude),\(punto2Cordinate!.longitude)")
                let mapsBound = GMSCoordinateBounds(coordinate: punto1Cordinate!, coordinate: punto2Cordinate!)
                //self.mapView.camera(for: mapsBound, insets: <#T##UIEdgeInsets#>)
               // self.mapView.cameraTargetBounds = mapsBound
                self.mapView.animate(with: GMSCameraUpdate.fit(mapsBound, withPadding: 120.0))
                //self.mapView.camera = GMSCameraPosition.

            }

        }
        dismiss(animated: true, completion: nil)
    }

при наличии двух точек камера должна находиться в центре маршрута между двумя точками, но камера не должна двигаться. я прекратил обновлять местоположение с помощью этой функции.

func textFieldDidBeginEditing(_ textField: UITextField) {
    self.stopMonitoringLocation()
    if textField == punto1Text{
        punto1 = true
    }else{
        punto1 = false
    }
    self.servicioOrigen.isHidden = true
    self.servicioHoras.isHidden = true
    let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self
    let filter = GMSAutocompleteFilter()
    filter.country = "es"
    //filter.
    //filter.type = .region
    //filter.type = .address
    autocompleteController.autocompleteFilter = filter
    present(autocompleteController, animated: true, completion: nil)
}

если местоположение отключено, то в первой точке анимация работает, и после добавления второй точки мне нужно переместить карту, чтобы она оказалась в центре маршрута, но если местоположение устройства включено, то камера не сможет сфокусироваться выбранное место.

...