(八十一)利用系统自带App来实现导航
利用系统的地图App进行导航,只需要传入起点和终点、启动参数,调用MKMapItem的类方法openMapWithItems:launchOptions:来实现定位,调用此方法后会打开系统的地图App。
下面我们来看看这个方法:
+ (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions;
①第一个参数是一个MapItem数组,每个MapItem中可以包含一个地标,用两个MapItem,一个作起点,一个作终点。
可以利用MKPlacemark初始化,而MKPlacemark可以利用CLPlacemark初始化,要得到CLPlacemark,可以利用CLGeocoder对象对地名进行地理编码得到。
②第二个参数是一个字典,字典中的键和值都可以通过手册查到,值可以使用之前设置地图属性时的值,注意非对象需要包装。
下面的代码演示了通过两个TextField输入起点和终点的地名,通过点击开始定位按钮实现打开系统自带地图App进行定位。
注意block是回调方法,为了保证顺序获取起点终点的地标,要在第一个block内写第二个block代码。
#import "ViewController.h" #import <MapKit/MapKit.h> @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *startView; @property (weak, nonatomic) IBOutlet UITextField *endView; @property (strong, nonatomic) CLGeocoder *gcoder; @property (strong, nonatomic) CLPlacemark *startMrk,*endMrk; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _gcoder = [[CLGeocoder alloc] init]; } - (IBAction)startGeo:(id)sender { NSString *startStr = _startView.text; NSString *endStr = _endView.text; [_gcoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) { if (!placemarks.count) return; _startMrk = [placemarks firstObject]; [_gcoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (!placemarks.count) return; _endMrk = [placemarks firstObject]; [self startNavigation]; }]; }]; } - (void)startNavigation{ MKPlacemark *startMrk = [[MKPlacemark alloc] initWithPlacemark:_startMrk]; MKPlacemark *endMrk = [[MKPlacemark alloc] initWithPlacemark:_endMrk]; MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMrk]; MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMrk]; NSArray *items = @[startItem,endItem]; NSMutableDictionary *options = [NSMutableDictionary dictionary]; /* 启动参数的key NSString * const MKLaunchOptionsDirectionsModeKey; NSString * const MKLaunchOptionsMapTypeKey; NSString * const MKLaunchOptionsMapCenterKey; NSString * const MKLaunchOptionsMapSpanKey; NSString * const MKLaunchOptionsShowsTrafficKey; NSString * const MKLaunchOptionsCameraKey 一般键值也是常量字符串,有些是结构体需要用@包装 */ options[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving; options[MKLaunchOptionsMapTypeKey] = @(MKMapTypeStandard); [MKMapItem openMapsWithItems:items launchOptions:options]; } @end