One way is to implement the UIGestureRecognizerDelegate
method gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
and return YES
in it:
//add <UIGestureRecognizerDelegate> to .h to avoid compiler warning
//add this where you create tapGestureRecognizer...
tapGestureRecognizer.delegate = self;
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Now your mapViewTapped:
will get called and then the map view's recognizer will call its method. If the tap was on an annotation view, the map view will show its callout (and the didSelectAnnotationView
delegate method will get called if you've implemented it).
Another way, if you need more control, then instead of doing the above, in your mapViewTapped:
you can check if the tap was on an annotation view and then manually select the annotation which will then show its callout (and call the didSelectAnnotationView
delegate method):
-(void)mapViewTapped:(UITapGestureRecognizer *)tgr
{
CGPoint p = [tgr locationInView:mapView];
UIView *v = [mapView hitTest:p withEvent:nil];
id<MKAnnotation> ann = nil;
if ([v isKindOfClass:[MKAnnotationView class]])
{
//annotation view was tapped, select it...
ann = ((MKAnnotationView *)v).annotation;
[mapView selectAnnotation:ann animated:YES];
}
else
{
//annotation view was not tapped, deselect if some ann is selected...
if (mapView.selectedAnnotations.count != 0)
{
ann = [mapView.selectedAnnotations objectAtIndex:0];
[mapView deselectAnnotation:ann animated:YES];
}
}
}