我有一个MapView显示一些带有displayPriority = .defaultHight
的注释,以允许自动聚类。
MapView还显示当前用户位置,其默认显示优先级为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
修改。有什么想法可以更改
displayPriority
批注视图的MKUserLocation
吗? 最佳答案
我花了几个小时尝试通过自定义默认用户位置注释来解决此问题,但无济于事。
相反,作为一种解决方法,我制作了自己的位置标记并隐藏了默认位置注释。这是我的代码:
在您的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
,以确保它不会隐藏其他注释。让我知道这是否有帮助!