5

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

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

我知道 didSelectAnnotationView 只应该在初始选择注释时调用。([1]:Selecting a MapView Annotation Twice ),并基于本文和我读过的其他文章([2]:ios mapkit 通过点击地图关闭注释标注),它看起来像检测到 MKAnnotationView 之后的任何额外点击它被选中需要一个 UITapGestureRecognizer。

所以,我正在使用 UITapGestureRecognizer 并且当我的注释视图已经被选中时,我可以正确地检测到额外的点击,当我识别出点击并且我正在隐藏/取消选择标注/注释时,我正在调用 deselectAnnotation分别。它在 iOS5 中运行良好,但在 iOS6 中只运行了一半

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

我假设正在发生的是,在我在我的点击手势识别器中取消选择注释视图后,点击事件仍然处于活动状态,mapView 检测到触摸事件并调用 selectAnnotationView,所以我刚刚的注释de-selected 现在再次被选中。

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

4

1 回答 1

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];
}

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

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
         for (UIGestureRecognizer *recognizer in view.gestureRecognizers) {
             [view removeGestureRecognizer:recognizer];
         }
}
于 2013-09-05T09:44:37.657 回答