iOS9 Day-by-Day :: Day 10 :: MapKit Transit

原文地址

这是一个系列文章,查看更多请移步目录页

MapKit 的每次迭代都会为开发者带来一些新的特性,iOS 9的更新也不例外。在本文中,我们将预览一些新的API。我们将在一个应用中使用它们,给大家展示一下如何通过程序来估算(货物的)运达时间。

Notable New API

MapKit View Improvements

现在你可以在地图控件上,指定更多的高级的布局和标注方式。MKAnnotation 现在拥有了如下可以自定义的属性。

* Title

* Subtitle

* Right Accessory View

* Left Accessory View

* Detail Callout Accessory View

Detail Callout Accessory View 是 iOS 9 中新增的,允许你自定义 detail accessory view,他支持auto layout 和 constraints。非常方便你自定义一个已经存在的标注。

另外,MKMapView 中也增加了一些新的、自解释的属性。如下:

* showsTraffic

* showsScale

* showsCompass

* Transit Improvements

Transit Improvements

在 iOS 9 中新介绍了 MKDirectionsTransportType。目前为止,也是唯一个能用于获取 ETA 请求的类。当你使用 calculateETAWithCompletionHandler 方法发起一个 ETA request后,可以得到一个 MKETAResponse 对象,包括了诸如运送时间、距离、预计到达时间、预计出发时间等数据。

Building a Sample App

为了演示这些 API,我们创建如下一个 App。这个 Demo 中,我们将演示当点击了伦敦的众多标记中的一个点后,他的 transit 相关信息。


result

第一步是在 storyboard 中创建 MKMapView 和 UITableView,添加一些必要的约束信息,以确保地图控件在页面的上半部分,而表格视图在页面的下半部分。

当这些完成后,给表格添加必要的元素。这里我们不展开解释怎么操作了,因为本文重点不是这个。你要确保 ViewController 作为 table 的数据源和 MKMapViewDelegate 的 delegate。当你把这些 UI 都创建好后,看起来像下面的样子。

storyboard

你需要自定义个UITableViewCell,目前为止,还很简单。都是一些 lable 控件,创建好他们和storyboard 之间的连接。

code 1

现在 storyboard 已经创建好了,我们开始在地图上添加一些标记。为了完成这些,我们需要添加几个目的地。创建 Destination 类,用来存储与位置有关的信息。

code 2

我们可以如下方式,简单的创建一个目的地。

code 3

我们添加几个地址,保存到数组,然后用来在加载地图后展示出来。

在 ViewController 的 viewDidLoad()方法中,添加如下代码,把目的地标示添加到地图中。

code 4

他们将展示在地图中,你同样需要初始化地图的起始地址。添加如下代码。

code 5

接下来,我们把目的地的相关信息,展示在表格中。

code 6

运行程序,你会看到目的地都已经标示在了地图上,同时在表格里也显示了标示的目的地的名称。

step 1

这很棒,但是我们还没法计算运输信息,因为我们还没有定义任何的出发地点。我们可以使用用户的地址,但是我们喜欢获得一个真实的距离信息。所以,我们用用户在地图上的一次点击来确定为起始点。

我们给地图控件添加一个点击的手势。

code 7

然后我们创建一个获取点击后的方法,将点击事件转换为地图上的一个坐标。

code 8

当创建完成后,我们把 coordinate 存储起来,稍后会用到。我们添加一个 annotation 用来展示用户的位置,如果之前已经存在的话,请先清除再添加。

code 9

最后,我们要把位置信息设置给表格的 cell,然后来更新 ETA 的信息。 首先,添加如下代码:

code 10

同样我们还需要给表格的 tableView:cellForRowAtIndexPath 的方法复制,以确保重新加载表格时能够正确的现实数据。添加如下代码:

code 11

当坐标正确的赋值给 tableviewcell 之后,我们要更新相关信息。

我们可以调用 userCoordinate 的 didSet 属性来设置更新。首先,我们要清理掉所用的lable的信息,因为之前所有的展示信息都不需要了。

code 12

现在我们有了一个用户设置的坐标作为起始位置,我们可以创建一个MKDirectionsRequest 对象来计算 ETA信息。我们设置MKMapItem的属性,设置initialised的坐标,设置终点坐标,设置transportType。最后,我们在calculateETAWithCompletionHandler 里获取ETA的信息,然后更新label的值。

code 13

现在,运行程序,你会得到下面的效果。

result

当你在地图上点击某处后,相应的表格里的ETA信息发生变化。

还有最后一件事时,响应 View Route 按钮的事件。在 IBAction 里添加如下代码:

code 14

这将会在打开的地图应用中,显示目的地,并展示出导航路线来。

Customising the Pin Colors

现在应用已经完整了,但是还有一点儿小毛病。就是无法分辨出哪些是我们展示的,哪些是用户点击的坐标。为了自定义 pin 的显示,我们指定 MKMapViewDelegate 的代理为ViewController,并实现它的协议。添加如下代码:

code 15

pinTintColor 是iOS 就中新介绍的可以设置(大头针)颜色的新的属性。如你所看到的,我们把用户点击后的大头针坐标的颜色设为红色。把一开始就设置好的目的地的大头针颜色设为蓝色。这样可以方便的分辨出用户设置的出发点和预设好的目的地的点。

延伸阅读

想了解更多关于本文中我们提到的 MapKit的新特性,请观看 WWDC 2015 的session 206,What’s New in MapKit。另外,你可以在 github 上下载到本文的 demo

这是一个系列文章,查看更多请移步目录页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容