(八十一)利用系统自带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


posted on 2015-07-22 20:54  张大大123  阅读(195)  评论(0编辑  收藏  举报

导航