IOS應用程序中使用Map Kit API開發地圖應用程序。其核心是MKMapView類的使用。咱們能夠設置地圖顯示方式,控制地圖,能夠在地圖上添加標註。app
1.顯示地圖框架
在Map Kit API中顯示地圖的師徒是MKMapView,他的委託協議是MKMapViewDelegate。Map Kit API使用須要導入MapKit框架。post
下面經過一個實例介紹一下Map Kit API的使用,實例如圖所示,再輸入查詢地點關鍵字文本框中輸入關鍵字,單擊查詢,先進行地理信息編碼查詢,查詢得到地標後在地圖上標註出來。編碼
首先添加框架MapKit.framework,設置視圖,在ViewController.h代碼以下:atom
1 #import <UIKit/UIKit.h> 2 #import <MapKit/MapKit.h> 3 #import "HBMapLocation.h" 4 5 @interface HBMaPViewController : UIViewController<MKMapViewDelegate> 6 @property (weak, nonatomic) IBOutlet UITextField *txtQueryKey; 7 @property (weak, nonatomic) IBOutlet MKMapView *mapView; 8 - (IBAction)gecodeQuery:(id)sender; 9 - (IBAction)getMyPlace:(id)sender; 10 11 @property (nonatomic ,readwrite)CLLocationCoordinate2D coordinate; 12 @end
其中頭文件中的「HBMapLocation.h」是咱們定義的描述地圖標註點類,稍後再說。在ViewController.m中代碼以下:spa
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 // Do any additional setup after loading the view. 5 self.mapView.mapType = MKMapTypeStandard; 6 self.mapView.delegate = self; 7 self.mapView.showsUserLocation = YES; 8 [_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 9 }
其中viewDidLoad方法中設置地圖的類型,他的類型有3種:code
(1)MKMapTypeStandard標註地圖類型orm
(2)MKMapTypeSatellite 衛星地圖類型blog
(3)MKMapTypeHybrid混合地圖類型。ip
2.添加標註
若是要實如今地圖視圖上添加標註點,須要兩個步驟:第一步時觸發添加動做;第二步是實現地圖委託方法mapView:viewForAnnotation:完成添加標註。
2.1 觸發添加動做
經過查詢按鈕觸發添加標註代碼以下:
1 - (IBAction)gecodeQuery:(id)sender { 2 3 if(_txtQueryKey.text == nil || [_txtQueryKey.text length] ==0 ) 4 { 5 return; 6 } 7 8 CLGeocoder *geocoder = [[CLGeocoder alloc]init]; 9 [geocoder geocodeAddressString:_txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) { 10 int i=[placemarks count]; 11 NSLog(@"查詢記錄數:%i",i); 12 13 if([placemarks count]>0) 14 { 15 [_mapView removeAnnotations:_mapView.annotations]; 16 } 17 18 for (int i=0; i<[placemarks count]; i++) { 19 CLPlacemark *placemark = placemarks[i]; 20 21 //關閉鍵盤 22 [self.txtQueryKey resignFirstResponder]; 23 24 //調整地圖位置和縮放比例 25 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(placemark.location.coordinate, 3000, 3000); 26 [_mapView setRegion:viewRegion animated:YES]; 27 28 HBMapLocation *annotation = [[HBMapLocation alloc]init]; 29 annotation.streetAddress=placemark.thoroughfare; 30 annotation.city=placemark.locality; 31 annotation.state=placemark.administrativeArea; 32 annotation.zip=placemark.postalCode; 33 annotation.coordinate=placemark.location.coordinate; 34 35 [_mapView addAnnotation:annotation]; 36 } 37 }]; 38 39 }
2. 實現地圖委託方法mapView:viewForAnnotation: 完成添加標註
1 - (IBAction)getMyPlace:(id)sender { 2 self.mapView.centerCoordinate = self.coordinate; 3 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(self.coordinate, 3000, 3000); 4 [_mapView setRegion:viewRegion animated:YES]; 5 6 } 7 8 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 9 { 10 MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOTATION"]; 11 12 if(annotationView == nil) 13 { 14 annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"PIN_ANNOTATION"]; 15 } 16 17 annotationView.pinColor = MKPinAnnotationColorPurple; 18 annotationView.animatesDrop = YES; 19 annotationView.canShowCallout = YES; 20 21 return annotationView; 22 }
3.跟蹤用戶位置變化
MapKit 提供個跟蹤用戶位置和方向變化的API,能夠不用本身編寫定位服務代碼。開啓地圖的showUserLocation屬性,並設置方法setUserTrackingMode:就能夠了,其代碼寫在viewDidLoad中。
而後還須要實現地圖視圖委託方法mapView:didUpdateUserLocation: 代碼以下
1 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 2 { 3 self.coordinate=userLocation.location.coordinate; 4 self.mapView.centerCoordinate = userLocation.location.coordinate; 5 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 3000, 3000); 6 [_mapView setRegion:viewRegion animated:YES]; 7 }
其中自定義標註類HBMapLocation.h代碼以下
1 #import <Foundation/Foundation.h> 2 #import <MapKit/MapKit.h> 3 4 @interface HBMapLocation : NSObject<MKAnnotation> 5 6 7 //街道信息屬性 8 @property (nonatomic,copy)NSString *streetAddress; 9 //城市信息屬性 10 @property (nonatomic,copy)NSString *city; 11 //州,省,市信息 12 @property (nonatomic,copy)NSString *state; 13 //郵編 14 @property (nonatomic,copy)NSString *zip; 15 //地理座標 16 @property (nonatomic ,readwrite)CLLocationCoordinate2D coordinate; 17 18 @end
HBMapLocation.m代碼以下:
1 @implementation HBMapLocation 2 3 -(NSString *)title 4 { 5 return @"要查找的位置"; 6 } 7 8 -(NSString *)subtitle 9 { 10 NSMutableString *ret = [NSMutableString new]; 11 if(_state) 12 { 13 [ret appendString:_state]; 14 } 15 if(_city) 16 { 17 [ret appendString:_city]; 18 } 19 if(_city && _state) 20 { 21 [ret appendString:@", "]; 22 } 23 if(_streetAddress && (_city || _state || _zip)) 24 { 25 [ret appendString:@"?"]; 26 } 27 if(_streetAddress) 28 { 29 [ret appendString:_streetAddress]; 30 } 31 if(_zip) 32 { 33 [ret appendFormat:@", %@",_zip]; 34 } 35 return ret; 36 } 37 38 @end
運行以下: