的MKMapView MKPointAnnotation点击事件(MKMapView MKPoint

2019-07-21 04:45发布

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

不过我在检测用户敲打事件的袭击。

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

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

而且,我必须在一些类,它实现MapViewDelegate(协议)实现这一点。

但我所有的困惑,无法前进。 谁能告诉我在哪里做什么呢?

对不起,所有的大惊小怪!

Answer 1:

有检测与标注视图的用户交互的两种方式。 常见的方法是定义一个标注(你看,当你在一个典型的地图应用一针一敲这个标准有点酥料饼泡)为您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被称为(在我的例子下面,执行SEGUE一些细节视图控制器):

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

我包括在上面的代码中产生了一些用户界面屏幕快照, 我的答案在这里 。



Answer 2:

剥夺例如用于夫特3:

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)
    }
}


Answer 3:

在此方法中添加按钮

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

} 


文章来源: MKMapView MKPointAnnotation tap event