修改现有的 MKAnnotationView

Modify existing MKAnnotationView

我有一个带有大量默认 MKAnnotationView 图钉的 MapKit 视图。我想修改一个现有的图钉(即一个已经出现在视图中一段时间​​,而不是在最初出现时的图钉)。当某个位置的基础数据发生变化时,我想更改它的副标题,并给它一个小动画(抖动或类似的)。

虽然我看到了我的 MKAnnotationView,但他们似乎没有 superview。例如:

for (MKAnnotationView *annotationView in self.mapView.annotations) {
    if (annotationView.superview) {
        NSLog(@"Hooray!");
    }
}

虽然我有很多注释(我看到了它们,而且我已经在此处的调试器中看到了它们),none 有一个 superView。

这可行吗?还是我需要为此目的实现自定义视图?

mapView.annotations 是注释数组,而不是注释视图数组。当您尝试在注释上调用 superview 方法时它没有崩溃,我感到有些惊讶。

获取注解视图,是

MKPinAnnotationView *annotationView = (id)[mapView viewForAnnotation:annotation];
if (annotationView) {
    // annotation view for this annotation is available
}

不过,我不清楚为什么您需要 superview 作为注释视图。就个人而言,我不愿意在地图视图的内部视图层次结构中乱搞。

如果我想动画化颜色的变化,我可能会这样做:

MKPinAnnotationView *visibleAnnotationView = (id)[mapView viewForAnnotation:annotation];
if (visibleAnnotationView) {
    [UIView transitionWithView:visibleAnnotationView duration:0.25 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
        visibleAnnotationView.pinTintColor = [UIColor blueColor];
    } completion:nil];
}

显然,做任何你想做的动画,但希望这能说明这个想法。

不过请注意,情况实际上比这复杂一点,因为如果用户将注释视图从屏幕上移开然后再打开,您的 MKMapViewDelegate 方法 mapView:viewForAnnotation: 会要知道注释视图的类型 return。所以你可能最终想要一个自定义 MKAnnotation 子类,其中包含你需要的任何状态信息,以便 mapView:viewForAnnotation: 可以相应地采取行动。