iOS系统导航/自绘制导航路线

系统自带导航

/**
 系统自带导航
 当前位置导航到目的地
 1.根据目的地进行地理编码
 2.把当前位置和目的地封装成MKMapItem对象
 3.使用 MKMapItem openMapsWithItems: launchOptions: 方法进行导航
 */
@interface ViewController ()

// 目的地的输入框
@property (weak, nonatomic) IBOutlet UITextField *destinationField;

/**
 *  点击按钮之后开始导航
 */
- (IBAction)navigate;

@end

@implementation ViewController

- (IBAction)navigate {
    // 1.拿到用户输入的目的地
    NSString *destination = self.destinationField.text;
    if (destination.length == 0) {
        return;
    }

    // 2.地理编码
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
        if (placemarks.count == 0 || error) return ;

        // 2.1.取出地理编码出的地标
        CLPlacemark *clpm = [placemarks firstObject];

        // 2.2.利用CLPlacemark来创建MKPlacemark
        MKPlacemark *mkpm = [[MKPlacemark alloc] initWithPlacemark:clpm];

        // 2.3.利用MKPlacemark来创建目的地的MKMapItem
        MKMapItem *destinationItem = [[MKMapItem alloc] initWithPlacemark:mkpm];

        // 2.4.拿到起点的MKMapItem
        MKMapItem *sourceItem = [MKMapItem mapItemForCurrentLocation];

        // 2.5.开始导航
        [self startNavigateWithSourceItem:sourceItem destinationItem:destinationItem];
    }];
}

/**
 *  开始导航
 *
 *  @param sourceItem      起点的Item
 *  @param destinationItem 终点的Item
 */
- (void)startNavigateWithSourceItem:(MKMapItem *)sourceItem destinationItem:(MKMapItem *)destinationItem
{
    // 1.将起点和终点item放入数组中
    NSArray *items = @[sourceItem, destinationItem];

    // 2.设置Options参数(字典)
//    MKLaunchOptionsDirectionsModeKey :导航模式
//    MKLaunchOptionsMapTypeKey:地图类型
//    MKLaunchOptionsShowsTrafficKey:是否显示交通状况
    NSDictionary *options = @{
            MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
            MKLaunchOptionsMapTypeKey : @(MKMapTypeHybrid),
            MKLaunchOptionsShowsTrafficKey : @YES
                    };

    // 3.开始导航
    [MKMapItem openMapsWithItems:items launchOptions:options];
}

@end

导航自定义绘制路线

#import "ViewController.h"
#import <MapKit/MapKit.h>

/**
 根据目的地自实现绘制路线
 1.封装当前位置和目的地为MKMapItem对象
 2.MKDirectionsRequest对象包装源地址和目的地址
 3.MKDirections的对象calculateDirectionsWithCompletionHandler:方法进行绘制
 4.使用Mapview addOverlay:polyLine]添加遍历出来的线路
 6.设置mapview代理,遵守协议,并实现- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(MKPolyline *)overlay方法(当往Mapview中添加一个遮盖到地图上时会执行该方法,此时画线才能正常显示)

 */
@interface ViewController () <MKMapViewDelegate>

// 地图的View
@property (weak, nonatomic) IBOutlet MKMapView *mapView;

// 目的地的输入框
@property (weak, nonatomic) IBOutlet UITextField *destinationField;

/**
 *  点击之后开始画线
 */
- (IBAction)drawLine;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.mapView.delegate = self;
}

- (IBAction)drawLine {
    // 0.退出键盘
    [self.view endEditing:YES];

    // 1.获取用户输入的目的地
    NSString *destination = self.destinationField.text;
    if (destination.length == 0) {
        return;
    }

    // 2.地理编码
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
        if (placemarks.count == 0 || error) return;

        // 2.1.获取CLPlaceMark对象
        CLPlacemark *clpm = [placemarks firstObject];

        // 2.2.利用CLPlacemark来创建MKPlacemark
        MKPlacemark *mkpm = [[MKPlacemark alloc] initWithPlacemark:clpm];

        // 2.3.创建目的地的MKMapItem对象
        MKMapItem *destinationItem = [[MKMapItem alloc] initWithPlacemark:mkpm];

        // 2.4.起点的MKMapItem
        MKMapItem *sourceItem = [MKMapItem mapItemForCurrentLocation];

        // 2.5.开始画线
        [self drawLineWithSourceItem:sourceItem destinationItem:destinationItem];
    }];
}

/**
 *  开始画线
 *
 *  @param sourceItem      起点的Item
 *  @param destinationItem 终点的Item
 */
- (void)drawLineWithSourceItem:(MKMapItem *)sourceItem destinationItem:(MKMapItem *)destinationItem
{
    // 1.创建MKDirectionsRequest对象
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];

    // 1.1.设置起点的Item
    request.source = sourceItem;

    // 1.2.设置终点的Item
    request.destination = destinationItem;

    // 2.创建MKDirections对象
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];

    // 3.请求/计算(当请求到路线信息的时候会来到该方法)
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        // 3.1.当有错误,或者路线数量为0直接返回
        if (error || response.routes.count == 0) return;

        NSLog(@"%ld", response.routes.count);

        // 3.2.遍历所有的路线
        for (MKRoute *route in response.routes) {

            // 3.3.取出路线(遵守MKOverlay)
            MKPolyline *polyLine = route.polyline;

            // 3.4.将路线添加到地图上
            [self.mapView addOverlay:polyLine];
        }
    }];
}

/**
 *  当一个遮盖添加到地图上时会执行该方法
 *
 *  @param overlay 遵守MKOverlay的对象
 *
 *  @return 画线的渲染
 */
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(MKPolyline *)overlay
{
    MKPolylineRenderer *poly = [[MKPolylineRenderer alloc] initWithPolyline:overlay];

    poly.strokeColor = [UIColor yellowColor];
    poly.lineWidth = 5.0;

    return poly;
}

@end
时间: 2024-10-16 13:38:09

iOS系统导航/自绘制导航路线的相关文章

导航 -MapKit - 获取路线信息绘制导航路线

#import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h" @interface PPViewController ()<MKMapViewDelegate> /** *  编码对象 */ @property (nonatomic, strong) CLGeocoder *geocoder; @property (weak, nonatomic

移动产品设计之ios系统的导航

做道题:[不定项选择题] OS中导航设计模式有几种? A.平铺导航 B.标签导航 C.树形导航 D.模态视图导航 正确答案:A B C 讲解: 导航始终是产品设计的重头戏,往往产品设计中90%的事情就是在做导航.在iphone中预置了3种可以直接使用的导航模式:平铺列表.标签页.树状结构,每种模式都配有不同的工具栏和控件.三种导航模式可以独立使用也可以混搭,让你的用户可以优雅的穿行与你的应用之中. (图片来源:Tapworthy) 平铺列表 这种方式主要用于只有一个主屏的简单应用.这种方式很适合

iOS核心笔记—MapKit框架-导航

1.导航简介: ?了解:导航,简单来说,就是根据用户指定的位置,进行路线规划:然后根据用户在行走过程中,实时的给出指引提示. 1-1.iOS导航实现方案: 方案 详细说明 方案一 将需要导航的位置传递给系统的地图APP进行导航 方案二 发送网络请求到Apple服务器/公司服务器获取导航数据,然后,手动绘制导航路线 方案三 利用第三方SDK实现导航功能(百度地图) ?说明:通常如果需要手动绘制导航路线,都是向Apple服务器发送请求.获取导航信息:此处,只对方案一.方案二做详细介绍,方案三将单独说

iOS开发UINavigation系列一——导航栏UINavigtionBar

iOS开发UINavigation系列一--导航栏UINavigtionBar 一.导航栏的使用 在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigationBar,实际上,我们也可以在不使用导航控制器的前提下,单独使用导航栏,在UINavigationBar中,也有许多我们可以定制的属性,用起来十分方便. 二.UINavigationBar的创建和风格类型 导航栏继承于UIView,所以我们可以像创建普通视图那样创建导航栏,比如我们创建一个高度为80的导航栏,将其放

iOS开发UINavigation系列四——导航控制器UINavigationController

iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言 在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationController是将这些控件和UIViewController紧密的结合了起来,使用导航,我们的应用程序层次会更加分明,对controller的管理也更加方便.前几篇博客地址如下: UINavigationBar:http://my.oschina

ios weibo 第二天 设置导航栏属性,添加加号按钮

要点:1.在底部添加加号按钮 2.设置导航栏属性 1.weibo底部的button其中四个按钮是一样的,其中中间的加号需要另外做处理 tablebar是自己定义的 ,代码如下 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 删除系统自动生成的UITabBarButton for (UIView *child in self.tabBar.subviews) { if ([child isKin

iOS开发项目—04添加导航栏的按钮

iOS开发项目—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>

iOS用户体验之-导航之道

用户不会意识到有导航指向的存在除非他遇到非预期的效果. 能够说导航时逻辑跳转的节点.所以导航对用户体验是至关重要的. iOS中有三种类型的导航.每一种适合不同类型的app. 1.层次类型的导航 在分层app中.一个选择相应一个页面,当这个页面没有分支为止,要想到达还有一个分支,你必须返回又一次的选择,iOS中 的setting和Mail就是非常好的样例. 2.平铺类型的导航 平铺类型的就能够看作是一个字典类型.通过键就跳到值的位置.如电话本,点击姓就跳到姓的组去了. 3.内容型或者用户体验的导航

iOS 开发之 - iOS6适配 - 导航栏按钮透明方法

首先上张图: 1:ios6导航栏默认按钮 rightBarButtonItem   是不是很丑的赶脚? 现在通过以下方法来改变以下:code: UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; rightButton.frame = CGRectMake(0, 0, 40, 40); [rightButton setTitle:@"提交" forState:UIControlStateNormal