我有一个UITapGestureRecognizer,当用户点击Map时,它会隐藏并在我的MKMap上显示一个工具栏 - 简单。
但是,当用户点击MKMapAnnotation时,我不希望地图以正常方式响应点击(上图)。此外,当用户点击地图上的其他位置以取消选择MKAnnotation标注时,我也不希望工具栏响应。因此,工具栏应仅在当前没有MKAnnotations处于选定状态时响应。当用户直接点击注释时,它也不应该响应。
到目前为止,我正在尝试以下对地图上的点击手势作出反应的操作 - 但是从未检测到注释视图(第一个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];
}
}
}
我需要以编程方式控制注释调用的启动,并检测tap事件何时触及注释以实现此目的。
任何帮助都将不胜感激。
答案 0 :(得分:1)
我认为您会发现以下链接非常有用:
http://blog.asynchrony.com/2010/09/building-custom-map-annotation-callouts-part-2/
How do I make a MKAnnotationView touch sensitive?
第一个链接讨论(除其他事项外)如何防止触摸传播到注释,以便它们选择性地响应,第二个链接如何检测触摸。
答案 1 :(得分:0)
我认为因为MKMapAnnotationView位于MKMapView之上,所以它们会获得触摸事件并对其进行响应(被选中),因此我认为您不需要手动选择注释。
然后,如果你看看Advanced Gesture Recognizer WWDC 2010视频,你会看到你的MKMapView无论如何都会收到点击事件,即使它在注释视图下面。这可能是你调用-(void)mapViewTapped:(UITapGestureRecognizer *)tgr
方法的原因。
除此之外,我不明白为什么你的if ([v isKindOfClass:[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;
}
}