Mapbox iOS:开启设备定位服务后,用户位置未显示

时间:2018-12-29 07:29:57

标签: ios swift mapbox userlocation

关闭设备位置服务后,用户将使用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 :(得分:0)

mapView具有名为showsUserLocation的Bool属性,即使在打开位置服务后,如果将此属性设置为false,也将不会显示用户的位置。

mapView.showsUserLocation = true添加到您的didChangeAuthorization方法中。

******编辑******

当地图添加每个注释,甚至userAnnotation时,都会调用

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
    }

如果您确实想为您的userAnnotation分配自定义图像,请在Mapbox网站上查看此示例,其中说明了操作方法。 Custom User Annotation