修改现有的MKAnnotationView

时间:2015-12-14 21:50:38

标签: ios objective-c mapkit mkannotation mkannotationview

我有一个带有大量默认MKAnnotationView引脚的MapKit视图。我想修改一个现有的引脚(即一段时间在视图上,而不是在初始出现时)。当一个地点的基础数据发生变化时,我想改变它的副标题,并给它一个小动画(摇晃或类似)。

当我看到MKAnnotationView时,他们似乎没有superview。例如:

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

虽然我有很多注释(我看到它们,加上我在调试器中看过它们),但没有一个有超级视图。

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

1 个答案:

答案 0 :(得分:2)

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:必须知道返回什么类型的注释视图。因此,您可能最终希望拥有一个自定义MKAnnotation子类,其中包含您需要的任何状态信息,以便mapView:viewForAnnotation:可以采取相应的行动。