iOS9學(xué)習(xí)系列:MapKit Transit
MapKit 的每次迭代都會為開發(fā)者帶來一些新的特性,iOS 9的更新也不例外。在本文中,我們將預(yù)覽一些新的API。我們將在一個應(yīng)用中使用它們,給大家展示一下如何通過程序來估算(貨物的)運達時間。
Notable New API
MapKit View Improvements
現(xiàn)在你可以在地圖控件上,指定更多的高級的布局和標注方式。MKAnnotation 現(xiàn)在擁有了如下可以自定義的屬性。
- Title
- Subtitle
- Right Accessory View
- Left Accessory View
- Detail Callout Accessory View
Detail Callout Accessory View 是 iOS 9 中新增的,允許你自定義 detail accessory view,他支持auto layout 和 constraints。非常方便你自定義一個已經(jīng)存在的標注。
另外,MKMapView 中也增加了一些新的、自解釋的屬性。如下:
- showsTraffic
- showsScale
- showsCompass
- Transit Improvements
Transit Improvements
在 iOS 9 中新介紹了 MKDirectionsTransportType。目前為止,也是唯一個能用于獲取 ETA 請求的類。當(dāng)你使用 calculateETAWithCompletionHandler 方法發(fā)起一個 ETA request后,可以得到一個 MKETAResponse 對象,包括了諸如運送時間、距離、預(yù)計到達時間、預(yù)計出發(fā)時間等數(shù)據(jù)。
Building a Sample App
為了演示這些 API,我們創(chuàng)建如下一個 App。這個 Demo 中,我們將演示當(dāng)點擊了倫敦的眾多標記中的一個點后,他的 transit 相關(guān)信息。
***步是在 storyboard 中創(chuàng)建 MKMapView 和 UITableView,添加一些必要的約束信息,以確保地圖控件在頁面的上半部分,而表格視圖在頁面的下半部分。
當(dāng)這些完成后,給表格添加必要的元素。這里我們不展開解釋怎么操作了,因為本文重點不是這個。你要確保 ViewController 作為 table 的數(shù)據(jù)源和 MKMapViewDelegate 的 delegate。當(dāng)你把這些 UI 都創(chuàng)建好后,看起來像下面的樣子。
你需要自定義個UITableViewCell,目前為止,還很簡單。都是一些 lable 控件,創(chuàng)建好他們和storyboard 之間的連接。
現(xiàn)在 storyboard 已經(jīng)創(chuàng)建好了,我們開始在地圖上添加一些標記。為了完成這些,我們需要添加幾個目的地。創(chuàng)建 Destination 類,用來存儲與位置有關(guān)的信息。
我們可以如下方式,簡單的創(chuàng)建一個目的地。
我們添加幾個地址,保存到數(shù)組,然后用來在加載地圖后展示出來。
在 ViewController 的 viewDidLoad()方法中,添加如下代碼,把目的地標示添加到地圖中。
他們將展示在地圖中,你同樣需要初始化地圖的起始地址。添加如下代碼。
接下來,我們把目的地的相關(guān)信息,展示在表格中。
運行程序,你會看到目的地都已經(jīng)標示在了地圖上,同時在表格里也顯示了標示的目的地的名稱。
#p#
這很棒,但是我們還沒法計算運輸信息,因為我們還沒有定義任何的出發(fā)地點。我們可以使用用戶的地址,但是我們喜歡獲得一個真實的距離信息。所以,我們用用戶在地圖上的一次點擊來確定為起始點。
我們給地圖控件添加一個點擊的手勢。
然后我們創(chuàng)建一個獲取點擊后的方法,將點擊事件轉(zhuǎn)換為地圖上的一個坐標。
當(dāng)創(chuàng)建完成后,我們把 coordinate 存儲起來,稍后會用到。我們添加一個 annotation 用來展示用戶的位置,如果之前已經(jīng)存在的話,請先清除再添加。
***,我們要把位置信息設(shè)置給表格的 cell,然后來更新 ETA 的信息。 首先,添加如下代碼:
同樣我們還需要給表格的 tableView:cellForRowAtIndexPath 的方法復(fù)制,以確保重新加載表格時能夠正確的現(xiàn)實數(shù)據(jù)。添加如下代碼:
當(dāng)坐標正確的賦值給 tableviewcell 之后,我們要更新相關(guān)信息。
我們可以調(diào)用 userCoordinate 的 didSet 屬性來設(shè)置更新。首先,我們要清理掉所用的lable的信息,因為之前所有的展示信息都不需要了。
現(xiàn)在我們有了一個用戶設(shè)置的坐標作為起始位置,我們可以創(chuàng)建一個MKDirectionsRequest 對象來計算 ETA信息。我們設(shè)置MKMapItem的屬性,設(shè)置initialised的坐標,設(shè)置終點坐標,設(shè)置transportType。***,我們在calculateETAWithCompletionHandler 里獲取ETA的信息,然后更新label的值。
現(xiàn)在,運行程序,你會得到下面的效果。
當(dāng)你在地圖上點擊某處后,相應(yīng)的表格里的ETA信息發(fā)生變化。
還有***一件事時,響應(yīng) View Route 按鈕的事件。在 IBAction 里添加如下代碼:
這將會在打開的地圖應(yīng)用中,顯示目的地,并展示出導(dǎo)航路線來。
Customising the Pin Colors
現(xiàn)在應(yīng)用已經(jīng)完整了,但是還有一點兒小毛病。就是無法分辨出哪些是我們展示的,哪些是用戶點擊的坐標。為了自定義 pin 的顯示,我們指定 MKMapViewDelegate 的代理為ViewController,并實現(xiàn)它的協(xié)議。添加如下代碼:
pinTintColor 是iOS 就中新介紹的可以設(shè)置(大頭針)顏色的新的屬性。如你所看到的,我們把用戶點擊后的大頭針坐標的顏色設(shè)為紅色。把一開始就設(shè)置好的目的地的大頭針顏色設(shè)為藍色。這樣可以方便的分辨出用戶設(shè)置的出發(fā)點和預(yù)設(shè)好的目的地的點。
延伸閱讀
想了解更多關(guān)于本文中我們提到的 MapKit的新特性,請觀看 WWDC 2015 的session 206,What’s New in MapKit。另外,你可以在 github 上下載到本文的 demo。