点击MKAnnotationView取消选择它并隐藏它的标注

Wil*_*ley 5 map mkmapview mkannotationview ios callout

我有一个带有自定义注释的iOS应用程序.

  1. 我希望能够点击一次MKAnnotationView来显示它的标注(工作正常)
  2. 然后我想第二次点击MKAnnotationView来取消选择注释并隐藏该注释的标注(适用于iOS5但不适用于iOS6).

我知道didSelectAnnotationView只应该用于初始选择注释.([1]:选择一个MapView注释两次 ),并基于这篇文章和其他人我已经读过([2]:通过点击地图关闭注释标注的ios mapkit),它看起来像是在检测到MKAnnotationView之后的任何额外点击它被选中需要一个UITapGestureRecognizer.

所以,我正在使用UITapGestureRecognizer,当我已经选择了我的注释视图时,我正在检测其他点击,当我识别出点击时我正在调用deselectAnnotation,而我正在隐藏/取消选择标注/注释分别.它在iOS5中运行良好,但它只有一半适用于iOS6

在iOS6中,调用轻击手势识别器,我调用我的代码来隐藏标注并取消选择注释,一切都很好,但随后以某种方式调用selectAnnotationView方法,因此我的标注再次显示,我的注释再次被选中.

我假设发生的事情是,在我的点击手势识别器中取消选择注释视图后,点击事件仍处于活动状态,mapView检测到触摸事件并调用selectAnnotationView,因此注释我只是现在正在再次选择取消选择.

我不知道为什么它只发生在iOS6中,但我希望能够输入任何其他想法来处理我想要的行为.

M t*_*e K 0

我不知道你是否仍然遇到问题(我希望没有,因为你的帖子有点旧)。但如果有些人遇到同样的问题,取消选择注释并避免 mapKit 重新选择它的一种解决方案是在取消选择注释之前添加一点延迟。

- (void)annotationTap:(UIGestureRecognizer *)gesture
{
    MKAnnotationView *mkav = (MKAnnotationView *)gesture.view;
    //Add a small delay to deselect
    [self performSelector:@selector(deselectAnnotation:)  withObject:mkav.annotation afterDelay:0.3];
    [gesture.view removeGestureRecognizer:gesture];
}


- (void)deselectAnnotation:(id<MKAnnotation>)annotation
{
    [self.mapView deselectAnnotation:annotation animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

如果用户取消选择地图上的注释,请点击 donMt forge 以使用此代码删除手势

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
         for (UIGestureRecognizer *recognizer in view.gestureRecognizers) {
             [view removeGestureRecognizer:recognizer];
         }
}
Run Code Online (Sandbox Code Playgroud)