MKMapView MKPointAnnotation点击事件

时间:2013-03-08 10:54:11

标签: ios objective-c mkmapview mapkit mkannotation

我有一个注释列表(MKPointAnnotation)。我有一个UIViewController用于整个视图,MKMapView实现Controller,我认为它对于检测用户与地图的交互非常有用,我自己的MKPointAnnotation实现(子类)Controller,它告诉我们如何显示注释。

然而,我对用户检测到点击事件感到震惊。

谷歌搜索告诉我,我必须通过实施以下功能来做一些事情。

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

并且我必须在实现MapViewDelegate(协议)的某个类中实现它。

但我很困惑,无法前进。谁能告诉我在哪做什么?

抱歉所有的大惊小怪!

3 个答案:

答案 0 :(得分:103)

有两种方法可以检测用户与注释视图的交互。常见的技巧是为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;
}

通过这样做,你会得到一个标注,但是你正在添加一个合适的配件,在我上面的例子中,它是一个披露指示器。这样,他们点击您的注释视图(在上面的示例中,地图上的图钉),他们看到标注,当他们点击该标注的正确附件(此示例中的小披露指示符)时,您的{{1调用(在我下面的例子中,对一些细节视图控制器执行segue):

calloutAccessoryControlTapped

这是小型iPhone屏幕上非常典型的用户体验。

但是,如果你不喜欢那个用户体验并且你不想要标准标注,而是你想要其他东西发生,你可以定义你的- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { [self performSegueWithIdentifier:@"DetailsIphone" sender:view]; } 以便不显示标注,但是相反,你拦截它并做其他事情(例如,在iPad上映射应用程序,你可能会显示一些更复杂的弹出窗口而不是标准的标注)。例如,您可以让MKAnnotationView不显示标注:

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

我在my answer here中为上述代码提供的用户界面添加了一些屏幕快照。

答案 1 :(得分:6)

Swift 3的Robs示例:

<script>
  $(document).ready(function() {
    var id = document.getElementById("num").value;

    for (i = 1; i <= id; i++) {
      $('#state' + i).click(function() {
        var stateID = $('input[type=checkbox]:checked').map(function() {
          return $(this).val();
        }).get().join();

        if (stateID) {
          $.ajax({
            type: 'POST',
            url: 'ajaxData.php',
            data: 'stateid=' + stateID,
            success: function(html) {
              $('#city').html(html);
            }
          });
        }
      });
    }
  });
</script>

答案 2 :(得分:4)

在此方法中添加按钮

-(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];

}