iOS開發之MapKit


MapKit框架的使用

導入框架

 

導入主頭文件

#import <MapKit/MapKit.h>

MapKit框架使用須知

MapKit框架中所有數據類型的前綴都是MK

MapKit有一個比較重要的UI控件 MKMapView,專門用於地圖顯示

跟蹤顯示用戶的位置

設置MKMapViewuserTrackingMode屬性可以跟蹤顯示用戶的當前位置

MKUserTrackingModeNone :不跟蹤用戶的位置

MKUserTrackingModeFollow :跟蹤並在地圖上顯示用戶的當前位置

MKUserTrackingModeFollowWithHeading :跟蹤並在地圖上顯示用戶的當前位置,地圖會跟隨用戶的前進方向進行旋轉

 

下圖是跟蹤效果

藍色發光圓點就是用戶的當前位置

藍色發光原點,專業術語叫做大頭針

 

地圖的類型

可以通過設置MKMapViewmapViewType設置地圖類型

MKMapTypeStandard :普通地圖(左圖)

MKMapTypeSatellite :衛星雲圖 (中圖)

MKMapTypeHybrid :普通地圖覆蓋於衛星雲圖之上(右圖) 

                

 

MKMapView的代理

MKMapView可以設置一個代理對象,用來監聽地圖的相關行為

 

常見的代理方法有

 1 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation; 

調用非常頻繁,不斷監測用戶的當前位置

每次調用,都會把用戶的最新位置(userLocation參數)傳進來

 1 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; 

地圖的顯示區域即將發生改變的時候調用

 1 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 

地圖的顯示區域已經發生改變的時候調用

MKUserLocation

MKUserLocation其實是個大頭針模型,包括以下屬性

 1 @property (nonatomic, copy) NSString *title; 

顯示在大頭針上的標題

 1 @property (nonatomic, copy) NSString *subtitle; 

顯示在大頭針上的子標題

 1 @property (readonly, nonatomic) CLLocation *location; 

地理位置信息(大頭針釘在什么地方?)

設置地圖的顯示

通過MKMapView的下列方法,可以設置地圖顯示的位置和區域

設置地圖的中心點位置

1 @property (nonatomic) CLLocationCoordinate2D centerCoordinate;
2 
3 - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;

設置地圖的顯示區域

1 @property (nonatomic) MKCoordinateRegion region;
2 
3 - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

MKCoordinateRegion

MKCoordinateRegion是一個用來表示區域的結構體,定義如下

1 typedef struct {
2 
3       CLLocationCoordinate2D center; // 區域的中心點位置
4 
5       MKCoordinateSpan span; // 區域的跨度
6 
7 } MKCoordinateRegion;

MKCoordinateSpan的定義

1 typedef struct {
2 
3     CLLocationDegrees latitudeDelta; // 緯度跨度
4 
5     CLLocationDegrees longitudeDelta; // 經度跨度
6 
7 } MKCoordinateSpan;

大頭針

什么是大頭針

現實生活中的大頭針

地圖上的大頭針

釘在某個具體位置,用來標識這個位置上有特定的事物(比如這個位置上有家餐館)

大頭針的基本操作

添加一個大頭針

- (void)addAnnotation:(id <MKAnnotation>)annotation;

添加多個大頭針

- (void)addAnnotations:(NSArray *)annotations;

移除一個大頭針

- (void)removeAnnotation:(id <MKAnnotation>)annotation;

 移除多個大頭針

- (void)removeAnnotations:(NSArray *)annotations;

(id <MKAnnotation>)annotation參數是什么東西?

大頭針模型對象:用來封裝大頭針的數據,比如大頭針的位置、標題、子標題等數據

大頭針模型

新建一個大頭針模型類

 1 #import <MapKit/MapKit.h>
 2 
 3 @interface MJTuangouAnnotation : NSObject <MKAnnotation>
 4 /** 坐標位置 */
 5 @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
 6 /** 標題 */
 7 @property (nonatomic, copy) NSString *title; 
 8 /** 子標題 */
 9 @property (nonatomic, copy) NSString *subtitle; 
10 @end

添加大頭針

1 MJTuangouAnnotation *anno = [[MJTuangouAnnotation alloc] init];
2 anno.title = @"你怎么看";
3 anno.subtitle = @"我趴窗戶上看";
4 anno.coordinate = CLLocationCoordinate2DMake(40, 116);
5 [self.mapView addAnnotation:anno];

自定義大頭針

很多情況下,需要自定義大頭針的顯示樣式,比如顯示一張圖片

 

自定義大頭針

如何自定義大頭針

設置MKMapView的代理

實現下面的代理方法,返回大頭針控件

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

根據傳進來的(id <MKAnnotation>)annotation參數創建並返回對應的大頭針控件

 

代理方法的使用注意

如果返回nil,顯示出來的大頭針就采取系統的默認樣式

標識用戶位置的藍色發光圓點,它也是一個大頭針,當顯示這個大頭針時,也會調用代理方法

因此,需要在代理方法中分清楚(id <MKAnnotation>)annotation參數代表自定義的大頭針還是藍色發光圓點

 1 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
 2 {
 3     // 判斷annotation的類型
 4     if (![annotation isKindOfClass:[MJTuangouAnnotation class]]) return nil;
 5     
 6     // 創建MKAnnotationView
 7     static NSString *ID = @"tuangou";
 8     MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
 9     if (annoView == nil) {
10         annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
11         annoView.canShowCallout = YES;
12     }
13     // 傳遞模型數據
14     annoView.annotation = annotation;
15     
16     // 設置圖片
17         MJTuangouAnnotation *tuangouAnnotation = annotation;
18     annoView.image = [UIImage imageNamed:tuangouAnnotation.icon];
19     
20     return annoView;
21 }

MKAnnotationView

地圖上的大頭針控件是MKAnnotationView

 MKAnnotationView的屬性

 1 @property (nonatomic, strong) id <MKAnnotation> annotation;
 2 大頭針模型
 3 
 4 @property (nonatomic, strong) UIImage *image;
 5 顯示的圖片
 6 
 7 @property (nonatomic) BOOL canShowCallout;
 8 是否顯示標注
 9 
10 @property (nonatomic) CGPoint calloutOffset;
11 標注的偏移量
12 
13 @property (strong, nonatomic) UIView *rightCalloutAccessoryView;
14 標注右邊顯示什么控件
15 
16 @property (strong, nonatomic) UIView *leftCalloutAccessoryView;
17 標注左邊顯示什么控件

MKPinAnnotationView

MKPinAnnotationViewMKAnnotationView的子類

MKPinAnnotationViewMKAnnotationView多了2個屬性

1 @property (nonatomic) MKPinAnnotationColor pinColor;
2 大頭針顏色
3 
4 @property (nonatomic) BOOL animatesDrop;
5 大頭針第一次顯示時是否從天而降

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM