參考:http://www.jianshu.com/p/9f00911bf530git
前言:之前作項目用高德地圖SDK,須要註冊帳號和AppID,而後下載SDK集成到項目中,比較麻煩,看了下蘋果自帶的MapKit框架,感受挺好用,官方文檔也介紹得很詳細,實現地圖的顯示、顯示用戶當前位置、放置大頭針、彈出氣泡等基本功能。但願能幫到剛接觸MapKit的朋友~乾貨點這裏數組
導入主頭文件:
框架#importui
MapKit框架使用須知:atom
MapKit框架中全部數據類型的前綴都是MK。代理
MapKit有一個比較重要的UI控件 :MKMapView,專門用於地圖顯示。對象
跟蹤顯示用戶的位置blog
設置MKMapView的userTrackingMode屬性能夠跟蹤顯示用戶的當前位置圖片
MKUserTrackingModeNone:不跟蹤用戶的位置 ip
MKUserTrackingModeFollow:跟蹤並在地圖上顯示用戶的當前位置
MKUserTrackingModeFollowWithHeading:跟蹤並在地圖上顯示用戶的當前位置,地圖會跟隨用戶的前進方向進行旋轉
藍色發光圓點就是用戶的當前位置 藍色發光原點,專業術語叫作「大頭針」
地圖的類型
能夠經過設置MKMapView的mapType設置地圖類型 MKMapTypeStandard:普通地圖
MKMapTypeSatellite:衛星雲圖
MKMapTypeHybrid:混合模式(普通地圖覆蓋於衛星雲圖之上)
MKMapTypeSatelliteFlyover:3D立體衛星(iOS9.0)
MKMapTypeHybridFlyover:3D立體混合(iOS9.0)
設置地圖的其餘屬性
1.操做項:
<1.>是否可縮放 :zoomEnabled
<2.>是否可滾動 :scrollEnabled
<3.>是否可旋轉 :rotateEnabled
2.顯示項:
<1.>是否顯示指南針 :showsCompass (iOS9.0)
<2.>是否顯示比例尺 :showsScale (iOS9.0)
<3.>是否顯示交通 :showsTraffic (iOS9.0)
<4.>是否顯示建築 :showsBuildings
使用注意:設置對應的屬性時,注意該屬性是從哪一個系統版本開始引入的,作好不一樣系統版本的適配
追蹤用戶的位置
設置MKMapView的userTrackingMode屬性能夠跟蹤顯示用戶的當前位置
MKUserTrackingModeNone:不跟蹤用戶的位置
MKUserTrackingModeFollow:跟蹤並在地圖上顯示用戶的當前位置
MKUserTrackingModeFollowWithHeading:跟蹤並在地圖上顯示用戶的當前位置,地圖會跟隨用戶的前進方向進行旋轉
注意:iOS8.0以後,追蹤用戶位置須要用戶進行定位受權
備註:
iOS8.0-,地圖不會自動滾動到用戶所在位置
iOS8.0+,地圖會自動放大到合適比例,並顯示出用戶位置
MKMapView的代理
MKMapView能夠設置一個代理對象,用來監聽地圖的相關行爲
常見的代理方法有
1.調用很是頻繁,不斷監測用戶的當前位置每次調用,都會把用戶的最新位置(userLocation參數)傳進來 - (void)mapView:(MKMapView*)mapViewdidUpdateUserLocation:(MKUserLocation*)userLocation;
2.地圖的顯示區域即將發生改變的時候調用 - (void)mapView:(MKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;
3.地圖的顯示區域已經發生改變的時候調用 - (void)mapView:(MKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated;
MKUserLocation(MKUserLocation實際上是個大頭針模型,包括如下屬性)
@property(nonatomic,copy)NSString*title;顯示在大頭針上的標題
@property(nonatomic,copy)NSString*subtitle;顯示在大頭針上的子標題
@property(readonly,nonatomic)CLLocation*location;地理位置信息(大頭針釘在什麼地方?)
設置地圖的顯示
經過MKMapView的下列方法,能夠設置地圖顯示的位置和區域
1.設置地圖的中心點位置 @property(nonatomic)CLLocationCoordinate2DcenterCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
2.設置地圖的顯示區域 @property(nonatomic)MKCoordinateRegionregion; - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
大頭針的基本操做
添加一個大頭針:- (void)addAnnotation:(id)annotation;
添加多個大頭針:- (void)addAnnotations:(NSArray*)annotations;
移除一個大頭針:- (void)removeAnnotation:(id)annotation;
移除多個大頭針:- (void)removeAnnotations:(NSArray*)annotations;
(id)annotation參數是什麼東西? 大頭針模型對象:用來封裝大頭針的數據,好比大頭針的位置、標題、子標題等數據
大頭針模型
新建一個大頭針模型類
#import
@interfaceMJTuangouAnnotation :NSObject
/**座標位置*/ @property(nonatomic,assign)CLLocationCoordinate2Dcoordinate;
/**標題*/ @property(nonatomic,copy)NSString*title;
/**子標題*/ @property(nonatomic,copy)NSString*subtitle;
@end
添加大頭針
EdTuangouAnnotation*anno = [[MJTuangouAnnotationalloc]init];
anno.title=@"熱愛iOS的狗";
anno.subtitle=@"所有課程15折,會員20折,老學員30折";
anno.coordinate=CLLocationCoordinate2DMake(40,116);
[self.mapViewaddAnnotation:anno];
MKAnnotationView:地圖上的大頭針控件是MKAnnotationView
MKAnnotationView的屬性
@property(nonatomic,strong)id annotation :大頭針模型
@property(nonatomic,strong)UIImage*image:顯示的圖片
@property(nonatomic)BOOLcanShowCallout:是否顯示標註
@property(nonatomic)CGPointcalloutOffset:標註的偏移量
@property(strong,nonatomic)UIView*rightCalloutAccessoryView:標註右邊顯示什麼控件
@property(strong,nonatomic)UIView*leftCalloutAccessoryView:標註左邊顯示什麼控件
MKPinAnnotationView
MKPinAnnotationView是MKAnnotationView的子類
MKPinAnnotationView比MKAnnotationView多了2個屬性
@property(nonatomic)MKPinAnnotationColorpinColor:大頭針顏色
@property(nonatomic)BOOLanimatesDrop:大頭針第一次顯示時是否從天而降
MKMapItem調用系統APP進行導航
主要方法:[MKMapItem openMapsWithItems:items launchOptions:md];
示例代碼
1.根據兩個地標對象進行調用系統導航 - (void)beginNavWithBeginPlacemark:(CLPlacemark*)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
{
2.建立起點:根據CLPlacemark地標對象建立MKPlacemark地標對象 MKPlacemark *itemP1 = [[MKPlacemark alloc]
initWithPlacemark:beginPlacemark];
MKMapItem *item1 = [[MKMapItem alloc]initWithPlacemark:itemP1];
3.建立終點:根據CLPlacemark地標對象建立MKPlacemark地標對象 MKPlacemark *itemP2 = [[MKPlacemark alloc]initWithPlacemark:endPlacemark];
MKMapItem *item2 = [[MKMapItem alloc]initWithPlacemark:itemP2];
NSDictionary *launchDic = @{
4.設置導航模式參數 MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
5.設置地圖類型 MKLaunchOptionsMapTypeKey :@(MKMapTypeHybridFlyover),
6.設置是否顯示交通
MKLaunchOptionsShowsTrafficKey : @(YES),
};
7.根據MKMapItem數組和啓動參數字典來調用系統地圖進行導航
[MKMapItem openMapsWithItems:@[item1, item2]
launchOptions:launchDic];
}
MKMapCamera地圖街景
主要方法:self.mapView.camera = camera;
示例代碼
1.建立視角中心座標:CLLocationCoordinate2D
center = CLLocationCoordinate2DMake(23.132931, 113.375924);
2.建立3D視角:
MKMapCamera *camera = [MKMapCameracameraLookingAtCenterCoordinate:center
fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude + 0.001,
center.longitude + 0.001) eyeAltitude:1];
3.設置到地圖上顯示:self.mapView.camera = camera;
MKMapSnapshotter地圖截圖
1.主要方法
[snapshotter startWithCompletionHandler:^(MKMapSnapshot
* _Nullable snapshot, NSError * _Nullable error) { }];
示例代碼
截圖附加選項:MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
1.設置截圖區域(在地圖上的區域,做用在地圖):
options.region =self.mapView.region;
options.mapRect =self.mapView.visibleMapRect;
2.設置截圖後的圖片大小(做用在輸出圖像)
options.size =self.mapView.frame.size;
3.設置截圖後的圖片比例(默認是屏幕比例,做用在輸出圖像)
options.scale = [[UIScreen mainScreen] scale];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]
initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *_Nullablesnapshot,
NSError*_Nullableerror) {
if(error) {
NSLog(@"截圖錯誤:%@",error.localizedDescription);
}else
{
4.設置屏幕上圖片顯示
self.snapshootImageView.image = snapshot.image;
將圖片保存到指定路徑(此處是桌面路徑,須要根據我的電腦不一樣進行修改)
NSData *data = UIImagePNGRepresentation(snapshot.image);
[data writeToFile:@"/Users/wangshunzi/Desktop/snap.png"atomically:YES];
}
}];
MKDirections獲取導航路線信息
主要方法
[directions calculateDirectionsWithCompletionHandler:
^(MKDirectionsResponse * _Nullable response,
NSError * _Nullable error) {
}];
繪製路線,添加覆蓋層等
主要方法:(這裏不像添加大頭針那樣,只要咱們添加了大頭針模型,默認就會在地圖上添加系統的大頭針視圖)
1.添加覆蓋層,須要咱們實現對應的代理方法,在代理方法中返回對應的覆蓋層[self.mapViewaddOverlay:overlay];
2.調用了以上方法後,會調用如下代理方法獲取對應的渲染塗層 -(MKOverlayRenderer *)mapView:(MKMapView*)mapView rendererForOverlay:(id)overlay