ios 如何在MapView中更改MKUserLocation注解的显示优先级?

bqucvtff  于 2022-12-24  发布在  iOS
关注(0)|答案(2)|浏览(106)

我有一个MapView,显示了一些带有displayPriority = .defaultHight的注解,以允许自动聚类。
Map视图还显示默认显示优先级为required的当前用户位置。
这导致当用户位置注解和我的注解非常接近时,它们会被隐藏。
我想通过将用户位置注解的显示优先级设置为defaultLow来更改此行为。
我试着使用这种方法:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation {
        let userView = mapView.view(for: annotation)
        userView?.displayPriority = .defaultLow
        return userView
    }
    return mapView.view(for: annotation)
}

但是userView总是nil,因此我对displayPriority的修改不适用。
您知道如何更改MKUserLocation注解视图的displayPriority吗?

bogh5gae

bogh5gae1#

我花了几个小时试图通过定制默认用户位置注解来解决这个问题,但无济于事。
相反,作为一种解决方案,我制作了自己的位置标记并隐藏了默认的位置注解。
将注解变量添加到viewController

private var userLocation: MKPointAnnotation?

viewDidLoad中,隐藏默认位置标记:

mapView.showsUserLocation = false

更新didUpdateLocations中的位置:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let userLocation = locations.first else { return }
        if self.userLocation == nil {
            let location = MKPointAnnotation()
            location.title = "My Location"
            location.coordinate = userLocation.coordinate
            mapView.addAnnotation(location)
            self.userLocation = location
        } else {
            self.userLocation?.coordinate = userLocation.coordinate
        }
    }

然后在viewFor annotation中自定义注解视图:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
            // user location annotation
            let identifier = "userLocation"
            var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)

            if annotationView == nil {
                annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
                (annotationView as? MKMarkerAnnotationView)?.markerTintColor = .blue
                annotationView?.canShowCallout = true
            } else {
                annotationView?.annotation = annotation
            }
            annotationView?.displayPriority = .defaultLow
            return annotationView
}

我将注解的displayPriority更改为.defaultLow,以确保它不会隐藏其他注解。
如果有帮助就告诉我!

0sgqnhkj

0sgqnhkj2#

如果有人还在纠结于这个问题,可以使用func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView])

// MARK: - MKMapViewDelegate

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
    for view in views {
        if view.annotation is MKUserLocation {
            view.displayPriority = .defaultLow
            break
        }
    }
}

这样,您仍然可以使用系统为MKUserLocation提供的视图,而不必手动构造自己的视图。

相关问题