代码之家  ›  专栏  ›  技术社区  ›  Hasti Ranjkesh

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

  •  0
  • Hasti Ranjkesh  · 技术社区  · 6 年前

    当设备定位服务关闭时,用户打开我的应用程序,该应用程序使用iOS Mapbox和Mapbox导航SDK。由于位置服务已关闭,用户无法在地图上看到其设备位置。当用户进入设备设置并打开定位服务,然后返回应用程序时,用户位置仍然不可见。当我通过mapview.user location.coordinate检查用户位置坐标时,得到一个无效的坐标。另外,即使调用locationManager.startupdingLocation(),也不能调用下面的委托方法:

    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
            }
        } 
    }
    

    由于未捕获的异常“mgluserlocationnotationtypeexception”,正在终止应用程序,原因:“用户位置批注视图必须是mgluserlocationnotationview的一种。我不知道为什么。我还实现了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 回复  |  直到 6 年前
        1
  •  0
  •   Magnas    6 年前

    MapView有一个名为 showsUserLocation 即使在打开位置服务之后,如果此属性设置为 false 则不会显示用户的位置。

    添加 mapView.showsUserLocation = true 进入你 didChangeAuthorization 方法。

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

    viewFor annotation 当映射添加每个批注,甚至用户批注时调用。但UserAnnotation需要是mgluserLocationAnnotationView。如果您正在为注释使用自定义图像,但不想将其添加到用户注释中,则需要将其排除在 注释视图 方法。最简单的方法是:

        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的网站上看到这个示例,说明如何进行。 Custom User Annotation