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


  • 相关阅读:
    用友U8 | 【存货管理】存货模块中采购入库单生成凭证的关联单据
    用友U8 | 【应收款管理】手工核销时提示:某某客户被其他用户锁定
    SQL Profiler 跟踪器工具使用说明
    转载--form表单的默认提交行为
    转载--c# chart控件基本使用方法(柱状图和饼图)
    转载--C#使用chart绘制实时折线图,波形图
    控件的InvokeRequired方法
    转载--浅析前端安全之 XSS
    转载--mysql语句如何插入含单引号或反斜杠的值详解
    转载--C#实现WinForm下DataGridView控件的拷贝和粘贴
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154120.html
Copyright © 2011-2022 走看看