MKMapView提供了didSelectAnnotationView:方法,用于报告用户首次点击图钉的时间。结果是显示了地图标注。我需要让用户通过再次点击引脚来关闭地图标注。
不幸的是,当用户点击已经选中的图钉时,didSelectAnnotationView:方法不会触发。
答案 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];
}
}