ユーザーがマップをタップすると、MKMap の上にツールバーを表示および非表示にする UITapGestureRecognizer があります。
ただし、ユーザーが 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];
}
}
}
これを実現するには、注釈呼び出しの起動をプログラムで制御し、タップ イベントがいつ注釈にヒットしたかを検出する必要があります。
どんな助けでも大歓迎です。