46

注釈のリストがあります (MKPointAnnotation)。ビュー全体用のUIViewController、マップとのユーザーのやり取りを検出するのに役立つと思われるMKMapViewを実装するコントローラー、注釈を表示する方法を伝える独自のMKPointAnnotationを実装する(サブクラス)コントローラーがあります。

ただし、ユーザーによるタップ イベントの検出には驚かされます。

グーグルは、次の機能を実装することによって何かをしなければならないと私に言いました。

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

また、MapViewDelegate (プロトコル) を実装するクラスでこれを実装する必要があります。

しかし、私はすべて混乱していて、前に進むことができません。どこで何をすればいいのか誰か教えてくれませんか?

大騒ぎしてごめんなさい!

4

3 に答える 3

106

注釈ビューに対するユーザーの操作を検出するには、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];
}

上記のコードによって生成されたユーザー インターフェイスの画面のスナップショットを、こちらの回答に含めます。

于 2013-03-08T15:50:12.647 に答える
6

このメソッドにボタンを追加

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{
  pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
  pinView.canShowCallout = YES;
}

Then callout method
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
      InfoView *infoView = [[InfoView alloc]initWithNibName:@"InfoView" bundle:nil];
        [self.navigationController pushViewController:infoView animated:YES];

} 
于 2013-03-08T11:21:18.123 に答える