当使用以下代码使用MapkKit单击MKAnnotationView时,我试图在引脚上显着放大:
MKCoordinateRegion mapRegion;
mapRegion.center = view.annotation.coordinate;;
mapRegion.span.latitudeDelta = 0.2;
mapRegion.span.longitudeDelta = 0.2;
[MKMapView animateWithDuration:0.15 animations:^{
[mapView setRegion:mapRegion animated: YES];
}];
但是,每当我放大时,我都希望引脚保持选中状态。有没有办法防止取消选择MKAnnotatiotionView并调用函数didDeselectAnnotationView
。
我认为它可能发生的原因是因为缩放上的mapView正在更新注释。如果这是原因,有没有办法防止这种情况发生?
答案 0 :(得分:1)
是的,如果[mapView setRegion: ...]
导致mapView
上的注释因任何原因而改变,那么您的选定注释将被取消选择(因为它将被删除!)。
解决此问题的一种方法是对注释进行'diff'替换。例如,目前您可能有一些看起来像的代码(用Swift表示):
func displayNewMapPins(pinModels: [MyCustomPinModel]) {
self.mapView.removeAnnotations(self.mapView.annotations) //remove all of the currently displayed annotations
let newAnnotations = annotationModels.map { $0.toAnnotation } //convert 'MyCustomPinModel' to an 'MKAnnotation'
self.mapView.addAnnotations(newAnnotations) //put the new annotations on the map
}
您想要将其更改为更像:
func displayNewMapPins(pinModels: [MyCustomPinModel]) {
let oldAnnotations = self.mapView.annotations
let newAnnotations = annotationModels.map { $0.toAnnotation }
let annotationsToRemove = SomeOtherThing.thingsContainedIn(oldAnnotations, butNotIn: newAnnotations)
let annotationsToAdd = SomeOtherThing.thingsContainedIn(newAnnotations, butNotIn: oldAnnotations)
self.mapView.removeAnnotations(annotationsToRemove)
self.mapView.addAnnotations(annotationsToAdd)
}
SomeOtherThing.thingsContainedIn(:butNotIn:)
的确切实现取决于您的要求,但这是您希望实现的通用代码结构。
这样做可以提高应用程序的性能 - 从MKMapView
添加和删除注释可能非常昂贵!