Ios 防止在点击MKAnnotation时检测到MKMapView上的触摸事件
我有一个UITapGestureRecognitor,当用户点击地图时,它会在我的MKMap上隐藏并显示工具栏-简单 但是,当用户点击MKMapAnnotation时,我不希望地图以正常方式响应点击(如上所述)。此外,当用户点击地图上的其他位置取消选择MKAnnotation标注时,我也不希望工具栏响应。因此,工具栏应仅在当前没有处于选定状态的注释时响应。当用户直接单击注释时,它也不应该响应 到目前为止,我一直在尝试对地图上的点击手势做出反应的以下操作-但是从未检测到注释视图(第一条if语句),而且,无论采用何种方法,注释视图也会启动Ios 防止在点击MKAnnotation时检测到MKMapView上的触摸事件,ios,iphone,mkmapview,mkannotation,mkannotationview,Ios,Iphone,Mkmapview,Mkannotation,Mkannotationview,我有一个UITapGestureRecognitor,当用户点击地图时,它会在我的MKMap上隐藏并显示工具栏-简单 但是,当用户点击MKMapAnnotation时,我不希望地图以正常方式响应点击(如上所述)。此外,当用户点击地图上的其他位置取消选择MKAnnotation标注时,我也不希望工具栏响应。因此,工具栏应仅在当前没有处于选定状态的注释时响应。当用户直接单击注释时,它也不应该响应 到目前为止,我一直在尝试对地图上的点击手势做出反应的以下操作-但是从未检测到注释视图(第一条if语句),
-(void)mapViewTapped:(UITapGestureRecognizer *)tgr
{
CGPoint p = [tgr locationInView:self.mapView];
UIView *v = [self.mapView hitTest:p withEvent:nil];
id<MKAnnotation> ann = nil;
if ([v isKindOfClass:[MKAnnotationView class]])<---- THIS CONDITION IS NEVER MET BUT ANNOTATIONS ARE SELECTED ANYWAY
{
//annotation view was tapped, select it…
ann = ((AircraftAnnotationView *)v).annotation;
[self.mapView selectAnnotation:ann animated:YES];
}
else
{
//annotation view was not tapped, deselect if some ann is selected...
if (self.mapView.selectedAnnotations.count != 0)
{
ann = [self.mapView.selectedAnnotations objectAtIndex:0];
[self.mapView deselectAnnotation:ann animated:YES];
}
// If no annotation view is selected currently then assume control of
// the navigation bar.
else{
[self showToolBar:self.navigationController.toolbar.hidden];
}
}
}
-(void)mapViewTapped:(UITapGestureRecognitor*)tgr
{
CGP点=[tgr locationInView:self.mapView];
UIView*v=[self.mapView hitTest:p with event:nil];
id ann=nil;
如果([v isKindOfClass:[MKAnnotationView class]])我想您会发现以下链接非常有用:
第一个链接讨论(除其他外)如何防止触摸传播到注释,以便它们有选择地响应,第二个链接讨论如何检测触摸。我认为,由于MKMapAnnotationView位于MKMapView之上,它们将获得触摸事件并响应它(被选中)因此,我认为您不需要手动选择注释
然后,如果您查看高级手势识别器WWDC 2010视频,您将看到您的MKMapView无论如何都会收到点击事件,即使它位于注释视图下方。这可能就是调用-(void)mapViewTapped:(UITapGestureRecognizer*)tgr
方法的原因
除此之外,我不明白为什么您的if([v iskindof class:[MKAnnotationView class]])
从来都不是真的。我在代码中做了完全相同的事情,它工作得很好
最后,为了回答您的最后一个问题,如果您不想在用户试图关闭标注时执行任何操作,您可以跟踪自定义isCalloutOpen布尔值,如下所示:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
//some code
_isCalloutOpen = YES;
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
// delay the reset because didDeselectAnnotationView could (and is often) called before your gesture recgnizer handler method get called.
[self performSelector:@selector(resetCalloutOpenState) withObject:Nil afterDelay:0.1];
}
- (void)resetCalloutOpenState {
_isCalloutOpen = NO;
}
- (void)mapViewTapped:(UITapGestureRecognizer *)tgr {
if (_isCalloutOpen) {
return;
}
}