IOS/MapKit:通过单击 MKPlacemark 启动本机地图应用程序

Posted

技术标签:

【中文标题】IOS/MapKit:通过单击 MKPlacemark 启动本机地图应用程序【英文标题】:IOS/MapKit: Launch Native Map App by Clicking on MKPlacemark 【发布时间】:2015-05-05 23:49:22 【问题描述】:

ios 新手刚学 Mapkit。我使用 MKPlacemark 在我的应用程序中加载地图。但是,有些用户可能想要使用更高级的功能,例如行车路线,为此,我认为,他们最好在我的顶部启动本机应用程序(当他们完成常规地图时,我的应用程序仍然在后台打开应用程序)

我知道如何使用 MKMapItem 从我的应用程序启动本机应用程序。但是,有一种方法可以在用户触摸地标后启动本机应用程序。

这是我正在使用的代码。

-(void) geoCodeAndMapIt 
    NSString* location = @"156 University Ave, Palo Alto, CA 94301";
    NSLog(@"going to map this address:  %@",location);
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:location
             completionHandler:^(NSArray* placemarks, NSError* error)
                 if (placemarks && placemarks.count > 0) 
                     CLPlacemark *topResult = [placemarks objectAtIndex:0];
                     MKPlacemark *placemark = [[MKPlacemark alloc]
                                               initWithPlacemark:topResult];
                     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(placemark.coordinate, 5000, 5000);//5000 is meters
                     region.span.longitudeDelta /= 8.0;
                     region.span.latitudeDelta /= 8.0;

                     [self.mapView setRegion:region animated:YES];
                     [self.mapView addAnnotation:placemark];

 //                    The following MKMapItem class launches the full blown native app.  Commenting it out causes the map to load in the app.  Otherwise, it fires up the native map app immediately in place of the previous app.

                     MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placemark];
                     mapItem.name = self.contact.first;
                     mapItem.phoneNumber = self.contact.tel;

                     NSDictionary *options = @
                                               MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
                                               MKLaunchOptionsMapTypeKey:
                                                   [NSNumber numberWithInteger:MKMapTypeSatellite],
                                               MKLaunchOptionsShowsTrafficKey:@YES
                                               ;
                     [mapItem setName:@"Name of your location"];
                     [mapItem openInMapsWithLaunchOptions:options];*/


                 
             
 ];


    [mapItem openInMapsWithLaunchOptions:options];

感谢您的任何建议。

【问题讨论】:

【参考方案1】:

只有当在 didSelectAnnotation 上调用 MKMapViewDelegate 时才应该调用 openInMaps:例如。

https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/index.html#//apple_ref/occ/intf/MKMapViewDelegate

要打开地图应用,您还可以使用以下内容自行构建 URL:

UIApplication.sharedApplication().openURL(...)

在此处查看此文档以了解其余内容:

https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html

【讨论】:

那么让地图视图页面订阅那个mapviewdelegate协议,成为自己的代理,监听didselectannotate,然后在didselectannotate方法中调用openinmaps? 将mapView委托设置为管理mapView的控制器。 self.mapView.delegate = 自我;然后在管理控制器中实现委托协议,特别是 didSelectAnnotation: 方法 好的。将其标记为正确但意识到我想做一些不同的事情,当用户单击触摸注释后出现的弹出窗口时打开本机地图应用程序。像 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"]; annotationView.canShowCallout = YES; annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];返回注解视图; 但卡在这里。 所以使用那个:mapView(_:annotationView:calloutAccessoryControlTapped:)

以上是关于IOS/MapKit:通过单击 MKPlacemark 启动本机地图应用程序的主要内容,如果未能解决你的问题,请参考以下文章

未调用 iOS MapKit completerDidUpdateResults

iOS MapKit 从外部文件创建 Pin 加载

iOS MapKit,细节较少

使用 iOS MapKit 显示交通和交通时间

无法更改图钉 iOS MapKit 的颜色

ios:mapkit如何在地图上启用当前位置按钮?