zoukankan      html  css  js  c++  java
  • (八十一)利用系统自带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


  • 相关阅读:
    Windows 下Nexus搭建Maven私服
    WebService中获取request对象一例
    利用window.navigator.userAgent判断当前是否微信内置浏览器
    批量插入写法
    MySql 使用递归函数时遇到的级联删除问题
    【Mysql】 你会用 information_schema吗?
    Volatile 多线程中用到的关键字
    spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。
    Android中操作SQLite数据库
    Oracle中的字符处理方法
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154120.html
Copyright © 2011-2022 走看看