在setRegion上取消选择MKAnnotationView

时间:2016-07-26 01:14:27

标签: ios objective-c swift mapkit mkannotationview

当使用以下代码使用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正在更新注释。如果这是原因,有没有办法防止这种情况发生?

1 个答案:

答案 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添加和删除注释可能非常昂贵!