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 == ) {
return;
} // 2.地理编码
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == || 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 == ) {
return;
} // 2.地理编码
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == || 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 == ) 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
iOS系统导航/自绘制导航路线的更多相关文章
- 导航 -MapKit - 获取路线信息绘制导航路线
#import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h& ...
- iOS系统中导航栏的转场解决方案与最佳实践
背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...
- 移动产品设计之ios系统的导航
做道题:[不定项选择题] OS中导航设计模式有几种? A.平铺导航 B.标签导航 C.树形导航 D.模态视图导航 正确答案:A B C 讲解: 导航始终是产品设计的重头戏,往往产品设计中90%的事情就 ...
- iOS 超 Easy 实现 渐变导航栏
接着上周的项目, 在上周我别出心裁的在自定义TabbarController中加入了自定义转场动画, 受到了大家广泛的喜爱, 再次表示感激, 今天我们继续实现LifestyleViewControll ...
- iOS用户体验之-导航之道
iOS用户体验之-导航之道 用户不会意识到有导航指向的存在除非他遇到非预期的效果. 能够说导航时逻辑跳转的节点.所以导航对用户体验是至关重要的. iOS中有三种类型的导航.每一种适合不同类型的app. ...
- iOS 上滑隐藏导航,下滑显示导航,仿斗鱼导航效果
UItableView或 UIcollectionView 都是继承UIScrollView 滑动的时候,判断是上滑还是下滑 使用 UIScrollView 的代理方法 func scrollView ...
- 苹果iOS系统下检查第三方APP是否安装及跳转启动
在iOS系统,使用Url Scheme框架在APP间互相跳转和传递数据,本文只介绍如果检测和跳转. Url Scheme框架 如果你想知道ios设备中是否安装QQ这个软件,我们可以通过一个简单方法判断 ...
- iOS: 如何正确的绘制1像素的线
iOS 绘制1像素的线 一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮 ...
- iOS系统架构
1.iOS系统架构 iOS的系统架构分为四个层次 核心操作系统层 (Core OS) 它包括 内存管理 , 文件系统 , 电源管理以及一些其他的操作系统任务, 它可以直接和硬件设备进行交互 核心服务层 ...
随机推荐
- php使用ajax导出CSV或者EXCEl(thinkphp)方法
首先我强烈推荐看到这篇文章的你将导出文件设置为csv格式的文件 实际测试导出csv文件的速度是excel文件的10几倍左右 首先我先介绍csv文件的导出的方法: 如果你单纯是在数据导出界面上通过用户点 ...
- 在xilinxFPGA上使用microblaze及自写GPIO中断
很久很久没有更新过博客了,今天来扒一扒FPGA上CPU软核的使用. 主要完成的功能:使用的开发板是nexys 4 DDR,板上有16个switch以及16个LED,需要完成microblaze对led ...
- Windows IIS 安装配置PHP环境
一. 概述 二.安装PHP 1.到php官网下载最新版PHP http://windows.php.net/download 三.配置IIS PHP环境
- c++程序设计之编程思想
代码块愈小,代码的功能就愈容易管理,代码的处理和移动就愈轻松. 任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员. 绝大多数情况下,函数应该放在它所使用的数据的所 ...
- ubuntu安装mysql-python出错,EnvironmentError: mysql_config not found
安装mysql-python包出错 Downloading MySQL-python-.zip (108kB) % |████████████████████████████████| 112kB 1 ...
- 云时代的分布式数据库:阿里分布式数据库服务DRDS
发表于2015-07-15 21:47| 10943次阅读| 来源<程序员>杂志| 27 条评论| 作者王晶昱 <程序员>杂志数据库DRDS分布式沈询 摘要:伴随着系统性能.成 ...
- 转换,2D,3D
一,转换定义: 1,能够改变元素的形状,尺寸,位置 2,转换分两种: 2D转换:只能在X,Y轴发生改变: 例子:旋转(rotate).拉伸(scale).平移(move).倾斜(skew) 3D转换: ...
- Windows Server 2008下asp+access无法登陆问题总结
今日把一套陈旧的企业办公平台部署至公司新采购的服务器,因为在本机windows7环境已经反复测试通过.本以为分分钟完成的事情,结果折腾了我2天.服务器系统:windows server 2008 r2 ...
- 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1
本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...
- 迷你MVVM框架 avalonjs1.5 入门教程
avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让许多靠政府项目或对兼容性要求够高的公司也能享受MVV ...