1

MKMapView 提供了 didSelectAnnotationView: 方法来报告用户第一次点击 pin 的时间。这样做的结果是显示地图标注。我需要让用户通过再次点击图钉来关闭地图标注。

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

4

2 回答 2

1

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

如果你真的想这样做,你可以利用两个非常靠近的引脚(或在完全相同的位置)通过两次轻敲连续选择的事实。你可以在真品后面放一个假别针,它不会显示标注。我不确定这到底是如何工作的。您需要让两个引脚相互了解,以便顶部的引脚始终显示标注。

于 2012-08-15T15:43:37.320 回答
0

我遇到了类似的问题,因为它MKMapView的选择模型与我的应用程序要求不太匹配。为了解决这个问题,我们需要一种方法来识别注释视图上的点击,即使它们已经被选中。我们可以通过UITapGestureRecognizer在委托方法中为每个注解视图添加一个来实现这一点mapView:viewForAnnotation:

根据您的交互模型,您可能需要使用 来完全驱动您的 UI 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];
    }
}
于 2015-07-01T19:50:32.470 回答