もっときれいな解決策があるかもしれませんが、トリックを行う 1 つの方法は hitTest:withEvent:
、タップ ジェスチャ認識セレクターを利用することです。
タップ ジェスチャ レコグナイザを_mapView
- (void)tapped:(UITapGestureRecognizer *)g
{
CGPoint p = [g locationInView:_mapView];
UIView *v = [_mapView hitTest:p withEvent:nil];
if (v == subviewOfKindOfClass(_mapView, @"MKAnnotationContainerView"))
NSLog(@"tap on the map"); //put your action here
}
// depth-first search
UIView *subviewOfKindOfClass(UIView *view, NSString *className)
{
static UIView *resultView = nil;
if ([view isKindOfClass:NSClassFromString(className)])
return view;
for (UIView *subv in [view subviews]) {
if ((resultView = subviewOfKindOfClass(subv, className)) break;
}
return resultView;
}
おそらくすべてのエッジケースをカバーしているわけではありませんが、私にとってはうまく機能しているようです。
更新 (iOS >= 6.0)
最後に、 iOS >= 6.0でのみ有効であるという欠点を持つ別の種類のソリューションを見つけ-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
ましUIView
た。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// overrides the default value (YES) to have gestureRecognizer ignore the view
return NO;
}
つまり、iOS 6 以降ではUIView
、ジェスチャ レコグナイザーが無視する各ビューでそのメソッドをオーバーライドするだけで十分です。