MKMapView MKPointAnnotation点击事件

Rav*_*oda 47 objective-c mapkit mkmapview mkannotation ios

我有一个注释列表(MKPointAnnotation).我有一个UIViewController这是整个视图,执行的MKMapView控制,我认为是用于检测与地图,告诉您如何显示注释的用户互动,我自己MKPointAnnotation实现(子类)控制器有用.

然而,我对用户检测到轻敲事件感到震惊.

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

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
Run Code Online (Sandbox Code Playgroud)

而且我必须在一些实现MapViewDelegate(协议)的类中实现它.

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

抱歉所有的大惊小怪!

Rob*_*Rob 105

有两种方法可以检测用户与注释视图的交互.常见的技术是定义一个标注(您在点击典型地图应用中的图钉时看到的标准小弹出气泡)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;
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,你会得到一个标注,但是你正在添加一个合适的配件,在我上面的例子中,它是一个披露指示器.这样,他们点击你的注释视图(在上面的例子中,地图上的一个图钉),他们看到了标注,当他们点击那个标注的右边附件(这个例子中的小披露指示符)时,你calloutAccessoryControlTapped被称为(在我的下面的例子中,执行segue到一些细节视图控制器):

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    [self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果你不喜欢那个用户体验并且你不想要标准的标注,而是你想要其他东西发生,那么你可以定义你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;
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以手动处理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];
}
Run Code Online (Sandbox Code Playgroud)

我在这里的答案中包含了上述代码所产生的用户界面的一些屏幕快照.


Rho*_*500 9

Swbs 3的Robs示例:

class MapViewController: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        // Create map view in storyboard
        view.delegate = self
    }
}

extension MapViewController: MKMapViewDelegate
{
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
    {
        let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotationView")
        annotationView.canShowCallout = true
        annotationView.rightCalloutAccessoryView = UIButton.init(type: UIButtonType.detailDisclosure)

        return annotationView
    }

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
    {
        guard let annotation = view.annotation else
        {
            return
        }

        let urlString = "http://maps.apple.com/?sll=\(annotation.coordinate.latitude),\(annotation.coordinate.longitude)"
        guard let url = URL(string: urlString) else
        {
            return
        }

        UIApplication.shared.openURL(url)
    }
}
Run Code Online (Sandbox Code Playgroud)


Baj*_*jaj 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];

} 
Run Code Online (Sandbox Code Playgroud)