MKMapView 提供了 didSelectAnnotationView: 方法来报告用户第一次点击 pin 的时间。这样做的结果是显示地图标注。我需要让用户通过再次点击图钉来关闭地图标注。
不幸的是,didSelectAnnotationView: 方法不会在用户点击已选中的图钉时触发。
这是一种非标准行为,会让您的用户感到困惑。通常,在引脚区域外轻敲会取消选择引脚。
如果你真的想这样做,你可以利用两个非常靠近的引脚(或在完全相同的位置)通过两次轻敲连续选择的事实。你可以在真品后面放一个假别针,它不会显示标注。我不确定这到底是如何工作的。您需要让两个引脚相互了解,以便顶部的引脚始终显示标注。
我遇到了类似的问题,因为它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];
}
}