如何检测用户何时点击MKMapView上当前选定的引脚?

时间:2012-08-14 23:58:57

标签: ios mkmapview

MKMapView提供了didSelectAnnotationView:方法,用于报告用户首次点击图钉的时间。结果是显示了地图标注。我需要让用户通过再次点击引脚来关闭地图标注。

不幸的是,当用户点击已经选中的图钉时,didSelectAnnotationView:方法不会触发。

2 个答案:

答案 0 :(得分:1)

这是一种非标准行为,会让您的用户感到困惑。通常,引脚区域外的抽头取消选择引脚。

如果你真的想要这样做,你可以使用2个引脚非常靠近(或在完全相同的位置)通过两个分接头连续选择的事实。你可以在真正的一个后面放一个假针,但不显示标注。我不确定这是如何工作的。你需要让两个引脚相互识别,以便最上面的引脚始终显示标注。

答案 1 :(得分:0)

我遇到了类似的问题,因为MKMapView的选择模型与我的应用程序要求不相符。要解决这个问题,我们需要的是一种识别注释视图上的点击的方法,即使它们已被选中。我们可以通过在委托方法UITapGestureRecognizer

中为每个注释视图添加mapView:viewForAnnotation:来实现此目的。

根据您的互动模式,您可能需要使用UITapGestureRecognizer完全驱动您的用户界面,而不是使用mapView:didSelectAnnotationView:mapView:didDeselectAnnotationView:例如,我使用地图视图作为用户选择器。因此,即使已经选择了该用户,选择用户也应该转到下一个视图控制器。选择仅向用户提供视觉反馈。

- (MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    MKPinAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"pinAnnotationIdentifier"];

    if (annotationView == nil)
    {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                                             reuseIdentifier:kSPUserAnnotationViewMapViewReuseIdentifier];

        // need to be able to select annotations that are already selected;
        UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(annotationViewTapped:)];
        [annotationView addGestureRecognizer:tapRecognizer];
    } 

    return annotationView;
}

- (void)annotationViewTapped:(id)sender
{
    UITapGestureRecognizer *tapRecognizer = (UITapGestureRecognizer*) sender;

        MKPinAnnotationView *userView = (MKPinAnnotationView*) tapRecognizer.view;
        [self userSelected:(MyUserModel*) userView.annotation];
    }
}