Почему местоположение пользователя в MKMapView показывает широту 0,0 и долготу 0,0? - PullRequest
0 голосов
/ 04 мая 2019

Все вопросы о переполнении стека, похожие на эти, относятся к Java и Android.

У меня есть следующий код с использованием элемента управления MKMapView.

override func viewDidLoad() {
    super.viewDidLoad()

    mapView.showsUserLocation = true
    mapView.setUserTrackingMode(.followWithHeading, animated: true)

    let locationCoordinate = CLLocationCoordinate2D(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
    currentLocationCoordinateRegion = MKCoordinateRegion(center: locationCoordinate, latitudinalMeters: 200, longitudinalMeters: 200)

    mapView.setRegion(currentLocationCoordinateRegion, animated: true)

    print("latitude:", mapView.userLocation.coordinate.latitude, "longitude:", mapView.userLocation.coordinate.longitude)

}

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

широта: 0.0 долгота: 0.0

Почему это происходит, и что я должен сделать, чтобы это исправить?

У меня также естьэлемент кнопки панели инструментов на панели инструментов со следующим кодом:

@IBAction func actionShow(_ sender: UIBarButtonItem) {

    print("latitude:", mapView.userLocation.coordinate.latitude, "longitude:", mapView.userLocation.coordinate.longitude)

    let locationCoordinate = CLLocationCoordinate2D(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
    currentLocationCoordinateRegion = MKCoordinateRegion(center: locationCoordinate, latitudinalMeters: 200, longitudinalMeters: 200)

    mapView.setRegion(currentLocationCoordinateRegion, animated: true)

}

, который дает те же результаты.

1 Ответ

1 голос
/ 04 мая 2019

Вы должны запросить разрешение на доступ к местоположению пользователя, это первое действие, которое вы выполняете в viewDidLoad, а затем переходите к отображению местоположения пользователя, когда у вас есть разрешение, после UIViewController вы получите

class ViewController: UIViewController {

    @IBOutlet var mapView: MKMapView!
    var locationManager: CLLocationManager?

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.delegate = self
        mapView.setUserTrackingMode(.followWithHeading, animated: true)

        self.checkLocationAuthorization()
    }

    func checkLocationAuthorization(authorizationStatus: CLAuthorizationStatus? = nil) {
        switch (authorizationStatus ?? CLLocationManager.authorizationStatus()) {
        case .authorizedAlways, .authorizedWhenInUse:
            mapView.showsUserLocation = true
        case .notDetermined:
            if locationManager == nil {
                locationManager = CLLocationManager()
                locationManager!.delegate = self
            }
            locationManager!.requestWhenInUseAuthorization()
        default:
            print("Location Servies: Denied / Restricted")
        }
    }

}

extension ViewController: MKMapViewDelegate, CLLocationManagerDelegate {

    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        let region = MKCoordinateRegion(center: userLocation.coordinate, latitudinalMeters: 200, longitudinalMeters: 200)
        mapView.setRegion(region, animated: true)
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        self.checkLocationAuthorization(authorizationStatus: status)
    }

}

Вы также должны включить следующие свойства в Info.plist, без них locationManager просто не перейдет к запросу авторизации.

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Message for AlwaysAndWhenInUseUsageDescription</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Message for AlwaysUsageDescription</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Message for WhenInUseUsageDescription</string>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...