在iOS 6之後,不再使用Google地圖了,而是使用蘋果自己的地圖,但是API編程介面沒有太大的變化。開發人員不需要再學習很多新東西就能開發地圖應用,這是負責任的做法。因此本節介紹的內容也同樣適用於iOS5上運行地圖應用開發。
iOS應用程式中使用Map Kit API開發地圖應用程式。 其核心是MKMapView類使用。我們可以設定地圖顯示方式、控制地圖,可以在地圖上添加標註。
顯示地圖
在Map Kit API中顯示地圖的視圖是MKMapView,它的委託協議是MKMapViewDelegate。Map Kit API使用需要匯入MapKit架構。
下面我們通過一個案例介紹一下面我們介紹一下Map Kit API的使用。這個案例在“輸入查詢地點關鍵字”文字框中輸入關鍵字,點擊“查詢”按鈕,先進行地理資訊編碼查詢,查詢獲得地標資訊後,在地圖上標註出來。
首先添加架構MapKit.framework。然後在工程中開啟MainStoryboard.storyboard的IB設計,從物件程式庫中拖拽Map View到設計畫面中。
調整它的位置和大小使得Map View儘可能填出畫面下面的空白部分,然後為Map View定義輸入出口。下面我們看看主視圖控制器ViewController.h代碼:
<UIKit/UIKit.h> <MapKit/MapKit.h> ViewController : UIViewController <MKMapViewDelegate>**- (IBAction)geocodeQuery:(
由 於使用Map Kit API,需要引入標頭檔<MapKit/MapKit.h>,標頭檔”MapLocation.h”是我們自己定義的 描述地表徵圖注點類。在定義ViewController時,還需要聲明實現MKMapViewDelegate協議。txtQueryKey屬性是查詢關 鍵字文字框,mapView屬性是MKMapView類型,它與畫面對應。點擊查詢按鈕觸發geocodeQuery:方法,它處理查詢並在地圖上做標 注。
下面我看看ViewController.m的viewDidLoad方法代碼:
- (= =
在viewDidLoad方法中設定地圖的類型,它的類型有3種:
MKMapTypeStandard 標註地圖類型。
MKMapTypeSatellite 衛星地圖類型。在衛星地圖中沒有街道名稱等資訊;
MKMapTypeHybrid 混合地圖類型。在混合地圖是在衛星地圖上標註出街道等資訊;
viewDidLoad方法的_mapView.delegate = self語句是當前視圖控制器賦值給地圖視圖的delegate屬性,這樣地圖視圖在需要的時候就會回調ViewController,如果失敗,回調下面的失敗方法:
- ()mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError *%
跟蹤使用者位置變化
MapKit提供了跟蹤使用者位置和方向變化的API,我們不用自己編寫定位服務代碼。開啟地圖視圖的showsUserLocation屬性,並設定方法setUserTrackingMode:就可以了,代碼如下:
- (= ==
其中代碼_mapView.showsUserLocation = YES,允許跟蹤顯示使用者位置資訊。在iOS裝置中顯示使用者位置方式是一個發亮的藍色小圓點。
[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]語句設定使用者跟蹤模式,使用者跟蹤模式有3種:
MKUserTrackingModeNone 。沒有使用者跟蹤模式;
MKUserTrackingModeFollow 。可以跟蹤使用者的位置變化;
MKUserTrackingModeFollowWithHeading 。可以跟蹤使用者的位置和方向變化;
然後,我們還需要實現地圖視圖委託方法mapView:didUpdateUserLocation:,它的代碼如下:
- ()mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *=
該委託方法在定位服務更新完成使用者位置時候回調該方法,我們在該方法中重新調整地圖的中心點為目前使用者的中心點,其中_mapView.centerCoordinate = userLocation.location.coordinate語句就是實現該目的。
這幾行代碼就可以跟蹤使用者位置的變化了,但是為了這樣一個小的案例拿著iPhone在外面跑一圈進行測試沒有必要。可以使用模擬器測試,模擬器有幾個固定的模式可以發出連續變化的資料。測試回合在畫面中會有一個小圓圈,它按照我們設定的速度一直運行。