IOS 使用IOS6蘋果地圖

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

運行以下:

相關文章
相關標籤/搜索