我有一个带有自定义注释的iOS应用程序。
- 我希望能够点击一次MKAnnotationView来显示它的标注(效果良好)
- 然后我想再次点击MKAnnotationView来取消选择注释并隐藏该注释的标注(适用于iOS5,但不适用于iOS6)
我知道didSelectAnnotationView应该只在注释的初始选择时调用。([1]:两次选择MapView注释),基于这篇文章和我读过的其他文章([2]:ios mapkit通过点击地图来关闭注释调用),在MKAnnotationView被选中后,检测到任何额外的点击都需要UIMapGestureRecognizer。
因此,我使用的是UIMapGestureRecognizer,当注释视图上的其他点击已经被选中时,我会正确地检测到这些点击,当我识别到这些点击时,我将调用deselectAnnotation,当我分别隐藏/取消选择标注/注释时。它在iOS5中运行良好,但在iOS6 中只运行了一半
在iOS6中,敲击手势识别器被调用,我调用我的代码来隐藏标注并取消选择注释,一切都很好,但随后以某种方式调用了selectAnnotationView方法,因此我的标注再次显示,我的注释再次被选中。
我认为发生的情况是,在我在点击手势识别器中取消选择注释视图后,点击事件仍然处于活动状态,mapView检测到触摸事件并调用selectAnnotationView,因此我刚刚取消选择的注释现在再次被选中。
我不知道为什么它只发生在iOS6中,但我希望能为处理我想要的行为提供其他想法。
我不知道你是否还有问题(我希望没有,因为你的帖子有点旧)。但如果有些人遇到同样的问题,取消选择注释并避免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];
}
}