Mapbox iOS: местоположение пользователя не отображается после включения службы определения местоположения устройства - PullRequest
0 голосов
/ 29 декабря 2018

Когда служба определения местоположения устройства отключена, пользователь открывает мое приложение, которое использует iOS Mapbox и Mapbox Navigation SDK.Пользователь не может видеть местоположение своего устройства на карте, потому что служба определения местоположения отключена.Когда пользователь заходит в настройки устройства и включает службу определения местоположения, а затем возвращается в приложение, местоположение пользователя все еще невидимо.Когда я проверяю координату местоположения пользователя по mapView.userLocation.coordinate, я получаю неверную координату.Также приведенный ниже метод делегата не вызывается, даже когда я вызываю locationManager.startUpdatingLocation ():

func mapView(_ mapView: MGLMapView, didUpdate userLocation: MGLUserLocation?)

. Я могу решить эту проблему, удалив старый вид карты и настроив новый вид карты.Это означает, что когда пользователь возвращается в приложение после перехода в «Настройки» и включения службы определения местоположения, мне нужно удалить старый вид карты и настроить другой, чтобы показать местоположение пользователя.Но я не хочу этого делать.

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse || status == .authorizedAlways {
        isLocationServicesEnabled = true
        if mapView != nil {
           mapView.removeFromSuperview()
           mapView = nil
        }
        resetupMapView()
    } 
}

Как показать местоположение пользователя на карте после включения службы определения местоположения?Можно ли как-нибудь перезагрузить вид карты?

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

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse || status == .authorizedAlways {
        if mapView != nil {
            mapView.showsUserLocation = true
        }
    } 
}

Завершение работы приложения из-за необработанного исключения«MGLUserLocationAnnotationTypeException», причина: «Представление аннотации местоположения пользователя должно быть своего рода MGLUserLocationAnnotationView.Я не знаю, почему это так.Я также реализовал метод делегата viewForAnnotation, чтобы показать пользовательское изображение для аннотации.

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
    let reuseIdentifier = "reusableView"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)

    if annotationView == nil {
        annotationView = MGLAnnotationView(reuseIdentifier: reuseIdentifier)
        let markerImageView = UIImageView(image: UIImage(named: "Orange"))
        markerImageView.frame = CGRect(x: 0, y: 0, width: viewModel.markerImageWidth, height: viewModel.markerImageHeight)
        annotationView?.frame = markerImageView.frame
        annotationView?.center = markerImageView.center
        annotationView?.addSubview(markerImageView)
    }
    return annotationView
}

1 Ответ

0 голосов
/ 29 декабря 2018

В mapView есть свойство Bool, которое называется showsUserLocation Даже после включения служб определения местоположения, если для этого свойства установлено значение false, местоположение пользователя не будет отображаться.

Добавьте mapView.showsUserLocation = true в вашdidChangeAuthorization метод.

****** РЕДАКТИРОВАТЬ ******

viewFor annotation вызывается, когда карта добавляет каждую из аннотаций, даже пользовательскую аннотацию.Но userAnnotation должен быть MGLUserLocationAnnotationView.Если вы используете собственные изображения для своих аннотаций, но не хотите добавлять их в userAnnotation, вам нужно исключить их из метода viewFor annotation.Самый простой способ:

    func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
        // We're not concerned with the user annotation.
        guard annotation is YOUR-ANNOTATION-TYPE else { return nil }

        let reuseIdentifier = "reusableView"
        var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)

       if annotationView == nil {
           annotationView = MGLAnnotationView(reuseIdentifier: reuseIdentifier)
           let markerImageView = UIImageView(image: UIImage(named: "Orange"))
           markerImageView.frame = CGRect(x: 0, y: 0, width: viewModel.markerImageWidth, height: viewModel.markerImageHeight)
           annotationView?.frame = markerImageView.frame
           annotationView?.center = markerImageView.center
           annotationView?.addSubview(markerImageView)
       }
       return annotationView
    }

Если вы хотите назначить пользовательское изображение для своего пользовательского примечания, посмотрите этот пример на веб-сайте Mapbox, где объясняется, как это сделать. Пользовательская аннотация пользователя

...