注釈ビューに対するユーザーの操作を検出するには、2 つの方法があります。一般的な手法は、MKAnnotationView
. viewForAnnotation
そして、標準的な方法で注釈の注釈ビューを作成します。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
}
これを行うと、コールアウトが表示されますが、適切なアクセサリが追加されます。これは、上記の例では開示インジケーターです。そうすれば、注釈ビュー (上記の例では地図上のピン) をタップすると吹き出しが表示され、その吹き出しの右側のアクセサリ (この例では小さな開示インジケーター) をタップすると、calloutAccessoryControlTapped
(以下の私の例では、いくつかの詳細ビューコントローラーへのセグエを実行しています):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
これは、小さな iPhone 画面での非常に典型的なユーザー エクスペリエンスです。
ただし、その UX が気に入らず、標準のコールアウトは必要なく、別の何かを発生させたい場合はMKAnnotationView
、コールアウトが表示されないように定義できますが、代わりにそれをインターセプトして別のことを行います。 (たとえば、iPad マップ アプリでは、標準のコールアウトではなく、より洗練されたポップオーバーを表示する場合があります)。たとえばMKAnnotationView
、吹き出しを表示しないようにすることができます。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = NO;
return annotationView;
}
didSelectAnnotationView
ただし、ユーザーがいつタップしたかを検出するために手動で処理できますMKAnnotationView
。この例では、ポップオーバーを示しています。
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[mapView deselectAnnotation:view.annotation animated:YES];
DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
controller.annotation = view.annotation;
self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
self.popover.delegate = self;
[self.popover presentPopoverFromRect:view.frame
inView:view.superview
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
上記のコードによって生成されたユーザー インターフェイスの画面のスナップショットを、こちらの回答に含めます。