MapKit框架的使用

MapKit框架的使用



一. 地圖的基本使用

1. 設(shè)置地圖顯示類型

  1. 地圖的樣式可以手動(dòng)設(shè)置, 在iOS9.0之前有3種, iOS9.0之后增加了2種

  2. 設(shè)置方式

     self.mapView.mapType = MKMapTypeStandard;
    
    枚舉類型 對(duì)應(yīng)含義
    MKMapTypeStandard 標(biāo)準(zhǔn)地圖
    MKMapTypeSatellite 衛(wèi)星地圖
    MKMapTypeHybrid 混合模式(標(biāo)準(zhǔn)+衛(wèi)星)
    MKMapTypeSatelliteFlyover 3D立體衛(wèi)星(iOS9.0)
    MKMapTypeHybridFlyover 3D立體混合(iOS9.0)

2. 設(shè)置地圖控制項(xiàng)

  1. 地圖的旋轉(zhuǎn), 縮放, 移動(dòng)等等操作行為都可以開啟或者關(guān)閉

  2. 設(shè)置方式

     self.customMapView.zoomEnabled = YES;   // 是否縮放
     self.customMapView.scrollEnabled = YES; // 是否滾動(dòng) 
     self.customMapView.rotateEnabled = YES; // 是否旋轉(zhuǎn)
     self.customMapView.pitchEnabled = NO; // 是否顯示3DVIEW
    

3. 設(shè)置地圖顯示項(xiàng)

  1. 地圖上的指南針, 比例尺, 建筑物, POI點(diǎn)都可以控制是否顯示

  2. 設(shè)置方式

    self.customMapView.showsCompass = YES; // 是否顯示指南針
    self.customMapView.showsScale = YES; // 是否顯示比例尺
    self.customMapView.showsTraffic = YES; // 是否顯示交通
    self.customMapView.showsBuildings = YES; // 是否顯示建筑物

4. 顯示用戶位置

  1. 可以設(shè)置顯示用戶當(dāng)前所在位置, 以一個(gè)藍(lán)點(diǎn)的形式呈現(xiàn)在地圖上

  2. 設(shè)置方式

     方案1:
         self.customMapView.showsUserLocation = YES;
     效果: 
         會(huì)在地圖上顯示一個(gè)藍(lán)點(diǎn), 標(biāo)識(shí)用戶所在位置; 但地圖不會(huì)縮放, 而且當(dāng)用戶位置移動(dòng)時(shí), 地圖不會(huì)跟隨用戶位置移動(dòng)而移動(dòng)
     
     方案2:
         self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
     效果:
         會(huì)在地圖上顯示一個(gè)藍(lán)點(diǎn), 標(biāo)識(shí)用戶所在位置; 而且地圖縮放到合適比例,顯示用戶位置, 當(dāng)用戶位置移動(dòng)時(shí), 地圖會(huì)跟隨用戶位置移動(dòng)而移動(dòng); 但是有時(shí)候失效;
    

    注意事項(xiàng): 如果要顯示用戶位置, 在iOS8.0之后, 需要主動(dòng)請(qǐng)求用戶授權(quán)

4. 測(cè)試環(huán)境

    1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本根據(jù)測(cè)試選擇不同版本(iOS9.0 只能使用 XCode7.0版本)
    3. iOS系統(tǒng)版本根據(jù)測(cè)試選擇不同版本(例如地圖類型, 在iOS9.0之后才有新增)

5. 常見問題總結(jié)

    1. 地圖加載不顯示?
        檢查網(wǎng)絡(luò)是否通暢
        
    2. 地圖放的太大都是格子, 禁止瀏覽
        正常, 為了安全等原因, 不會(huì)看的太詳細(xì)
        
    3. 地圖運(yùn)行起來APP占用內(nèi)存非常大
        正常, 地圖加載了很多資源
        
    4. 用戶位置不顯示
        首先, 檢查代碼, 是否有設(shè)置顯示用戶位置,是否有進(jìn)行請(qǐng)求位置授權(quán)
        其次, 查看模擬器是否有位置信息
        第三, 重置模擬器, 模擬器又發(fā)神經(jīng)了.

二. 地圖的中級(jí)使用

1. 查看當(dāng)前用戶位置信息

  1. 設(shè)置地圖代理

  2. 實(shí)現(xiàn)代理方法

     -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
     {
         NSLog(@"%@", userLocation);
     }
    

2. 調(diào)整地圖顯示中心

  1. 確定地圖中心經(jīng)緯度坐標(biāo)

     CLLocationCoordinate2D center =  CLLocationCoordinate2DMake(21.123, 121.345);
    
  2. 設(shè)置地圖中心為給定的經(jīng)緯度坐標(biāo)

     [mapView setCenterCoordinate:center animated:YES];
    

3. 調(diào)整地圖顯示區(qū)域

  1. 獲取合適的區(qū)域跨度

     實(shí)現(xiàn)當(dāng)?shù)貓D區(qū)域發(fā)生改變時(shí)調(diào)用的代理代理方法, 并調(diào)整地圖區(qū)域到合適比例, 并在對(duì)應(yīng)的方法中, 獲取對(duì)應(yīng)的跨度信息
     代碼如下:
         - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
         {
             NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
         }
    
  2. 創(chuàng)建一個(gè)區(qū)域(包含區(qū)域中心, 和區(qū)域跨度)

         CLLocationCoordinate2D center =  CLLocationCoordinate2DMake(21.123, 121.345);
         MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
         MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
    
  3. 設(shè)置地圖顯示區(qū)域

         [self.mapView setRegion:region animated:YES];
    
  4. 跨度概念解釋

     MKCoordinateSpan 跨度解釋:
         latitudeDelta:緯度跨度,因?yàn)槟媳本暩?0.0度早歇,所以此值的范圍是(0.0---180.0);此值表示艘包,整個(gè)地圖視圖寬度渴邦,顯示多大跨度;
         
         longitudeDelta:經(jīng)度跨度订晌,因?yàn)闁|西經(jīng)各180.0度艺智,所以此值范圍是(0.0---360.0):此值表示迄委,整個(gè)地圖視圖高度隶债,顯示多大跨度;
         
         注意:地圖視圖顯示,不會(huì)更改地圖的比例跑筝,會(huì)以地圖視圖高度或?qū)挾容^小的那個(gè)為基準(zhǔn),按比例調(diào)整
    

4. MKUserLocation 大頭針數(shù)據(jù)模型詳解

 MKUserLocation : 被稱作“大頭針(數(shù)據(jù))模型”;
    其實(shí)喊什么都行瞒滴,本質(zhì)就是一個(gè)數(shù)據(jù)模型曲梗,只不過此模型遵循了大頭針要遵循的協(xié)議(MKAnnotation)
 
 重要屬性:
    location    :  用戶當(dāng)前所在位置信息(CLLocation對(duì)象)
    title       :  大頭針標(biāo)注要顯示的標(biāo)題(NSString對(duì)象)
    subtitle    :  大頭針標(biāo)注要顯示的子標(biāo)題(NSString對(duì)象)

5. 測(cè)試環(huán)境

    1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

6. 常見問題總結(jié)

    1. 地圖上的藍(lán)點(diǎn)為啥不顯示?
        第一: 確定代碼是否有誤(例如, 是否顯示了用戶位置)
        第二: 確定模擬器是否設(shè)置位置
        第三: 看下位置在哪, 是不是不在當(dāng)前地圖顯示區(qū)域
        
    2. 地圖跨度設(shè)置之后, 最終顯示的跨度和設(shè)置數(shù)值不一致?
        因?yàn)榈厍虻牟皇钦叫蔚? 隨著用戶的位置移動(dòng), 會(huì)自動(dòng)修正地圖跨度, 保持地圖不變形;

三. 地圖高級(jí)-大頭針基本使用

1. 理論支撐(必須掌握)

按照MVC的原則
*  在地圖上操作大頭針,實(shí)際上是控制大頭針數(shù)據(jù)模型
    1. 添加大頭針就是添加大頭針數(shù)據(jù)模型
    2. 刪除大頭針就是刪除大頭針數(shù)據(jù)模型

2. 在地圖上添加大頭針視圖

  1. 自定義大頭針數(shù)據(jù)模型

     1) 創(chuàng)建繼承自NSObject的數(shù)據(jù)模型XMGAnnotation, 遵循大頭針數(shù)據(jù)模型必須遵循的協(xié)議(MKAnnotation)
     2) 注意將協(xié)議@property 中的readonly 去掉;
    
  2. 創(chuàng)建大頭針數(shù)據(jù)模型, 并初始化參數(shù)

     XMGAnnotation *annotation = [[XMGAnnotation alloc] init];
     annotation.coordinate = coordinate;
     annotation.title = @"XXX";
     annotation.subtitle = @"XXXXXXX";
    
  3. 調(diào)用地圖的添加大頭針數(shù)據(jù)模型方法

     [self.customMapView addAnnotation:annotation];
    

3. 移除大頭針(所有大頭針)

    NSArray *annotations = self.customMapView.annotations;
    [self.customMapView removeAnnotations:annotations]; 

4. 場(chǎng)景模擬

  1. 場(chǎng)景描述:

     鼠標(biāo)點(diǎn)擊在地圖哪個(gè)位置, 就在對(duì)應(yīng)的位置添加一個(gè)大頭針, 并在標(biāo)注彈框中顯示對(duì)應(yīng)的城市和街道;
    
  2. 實(shí)現(xiàn)步驟

     1. 獲取觸摸點(diǎn)在地圖上對(duì)應(yīng)的坐標(biāo)
         UITouch *touch = [touches anyObject];
         CGPoint touchPoint = [touch locationInView:self.customMapView];
         
     2. 將坐標(biāo)轉(zhuǎn)換成為經(jīng)緯度
         CLLocationCoordinate2D center = [self.customMapView convertPoint:touchPoint toCoordinateFromView:self.customMapView];
         
     3. 根據(jù)經(jīng)緯度創(chuàng)建大頭針數(shù)據(jù)模型, 并添加在地圖上
         XMGAnnotation *annotation = [[XMGAnnotation alloc] init];
         annotation.coordinate = coordinate;
         annotation.title = @"XXXX";
         annotation.subtitle = @"XXXXX";
         [self.customMapView addAnnotation:annotation];
     
     4. 利用反地理編碼, 獲取該點(diǎn)對(duì)應(yīng)的城市和街道名稱, 然后修改大頭針數(shù)據(jù)模型
         注意: 設(shè)置彈框數(shù)據(jù)時(shí), 對(duì)應(yīng)的大頭針數(shù)據(jù)模型應(yīng)有對(duì)應(yīng)的占位數(shù)據(jù)(這樣對(duì)應(yīng)的UI才會(huì)生成,后面才能重新修改數(shù)據(jù))
    

5. 測(cè)試環(huán)境

    1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

6. 常見問題總結(jié)

    1. 反地理編碼無法獲取對(duì)應(yīng)的數(shù)據(jù)
        第一: 檢查是否有聯(lián)網(wǎng)
        第二: 檢查代碼是否有誤
        第三: 有時(shí)存在某些位置沒有反地理編碼結(jié)果, 換個(gè)點(diǎn)嘗試, 如果都沒有, 排除此原因

四. 地圖高級(jí)-大頭針的自定義

1. 理論支撐

按照MVC的原則
    1. 每當(dāng)添加一個(gè)大頭針數(shù)據(jù)模型時(shí), 地圖就會(huì)調(diào)用對(duì)應(yīng)的代理方法, 查找對(duì)應(yīng)的大頭針視圖,顯示在地圖上;
    2. 如果該方法沒有實(shí)現(xiàn), 或者返回nil, 那么就會(huì)使用系統(tǒng)默認(rèn)的大頭針視圖

2. 模擬系統(tǒng)默認(rèn)的大頭針實(shí)現(xiàn)方案

  1. 實(shí)現(xiàn)當(dāng)添加大頭針數(shù)據(jù)模型時(shí),地圖回調(diào)的代理方法

     -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XMGAnnotation *)annotation
     {
     
     }
    
  2. 實(shí)現(xiàn)須知

     1. 大頭針系統(tǒng)對(duì)應(yīng)的視圖是 MKPinAnnotationView,它繼承自 MKAnnotationView
     2. 地圖上的大頭針視圖妓忍,和tableview上的cell一樣虏两,都使用“循環(huán)利用”的機(jī)制
    
  3. 實(shí)現(xiàn)代碼

     static NSString *pinID = @"pinID";
     MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
     if (!pinView) {
         pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID];
     }
     pinView.annotation = annotation;
    
     // 彈出標(biāo)注
     pinView.canShowCallout = YES;
    
     // 修改大頭針顏色
     pinView.pinColor = MKPinAnnotationColorPurple;
    
     // 設(shè)置大頭針從天而降
     pinView.animatesDrop = YES;
    
     // 設(shè)置大頭針可以被拖拽(父類中的屬性)
     pinView.draggable = YES;
    
     return pinView;
    

3. 自定義大頭針

  1. 實(shí)現(xiàn)當(dāng)添加大頭針數(shù)據(jù)模型時(shí),地圖回調(diào)的代理方法

     -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XMGAnnotation *)annotation
     {
     
     }
    
  2. 實(shí)現(xiàn)須知

     1. 如果想要自定義大頭針, 必須使用 MKAnnotationView 或者 自定義的子類
     2. 但是不能直接使用系統(tǒng)默認(rèn)的大頭針, 會(huì)無效
    
  3. 實(shí)現(xiàn)代碼

     // 自定義大頭針
     static NSString *pinID = @"pinID";
     MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
     if (!customPinView) {
         customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
     }
    
     // 設(shè)置大頭針圖片
         customPinView.image = [UIImage imageNamed:@"category_3"];
         
     // 設(shè)置大頭針可以彈出標(biāo)注
         customPinView.canShowCallout = YES;
         
     // 設(shè)置標(biāo)注左側(cè)視圖
         UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
         leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
         customPinView.leftCalloutAccessoryView = leftIV;
    
     // 設(shè)置標(biāo)注右側(cè)視圖
         UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
         rightIV.image = [UIImage imageNamed:@"eason.jpg"];
         customPinView.rightCalloutAccessoryView = rightIV;
    
     // 設(shè)置標(biāo)注詳情視圖(iOS9.0)
         customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];
    
     return customPinView;
    

4. 代理方法補(bǔ)充

  1. 選中一個(gè)大頭針時(shí)調(diào)用

     -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
     {
         NSLog(@"選中%@", [view.annotation title]);
     }
    
  2. 取消選中大頭針時(shí)調(diào)用

     -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
     {
         NSLog(@"取消選中%@", [view.annotation title]);
     }
    

5. 測(cè)試環(huán)境

    1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

6. 常見問題總結(jié)

    1. 代碼運(yùn)行在低版本的XCode上, 編譯失敗
        第一: 語法錯(cuò)誤; XCode7.0 對(duì)于OC語法優(yōu)化了一些, 需要手動(dòng)調(diào)整
        第二: iOS9.0的SDK, 在XCode7.0之前的版本沒有對(duì)應(yīng)的API

五. 利用系統(tǒng)App導(dǎo)航

1. 導(dǎo)航的三種實(shí)現(xiàn)方案

1. 可以將需要導(dǎo)航的位置丟給系統(tǒng)的地圖APP進(jìn)行導(dǎo)航
2. 發(fā)送網(wǎng)絡(luò)請(qǐng)求到公司服務(wù)器獲取導(dǎo)航數(shù)據(jù), 然后自己手動(dòng)繪制導(dǎo)航
3. 利用三方SDK實(shí)現(xiàn)導(dǎo)航(百度)

2. 直接將起點(diǎn)和終點(diǎn), 傳遞給系統(tǒng)地圖, 利用系統(tǒng)APP, 進(jìn)行導(dǎo)航

  1. 利用"反推法", 記住關(guān)鍵代碼即可

  2. 代碼如下:

     // 根據(jù)兩個(gè)地標(biāo)對(duì)象進(jìn)行調(diào)用系統(tǒng)導(dǎo)航
     - (void)beginNavWithBeginPlacemark:(CLPlacemark *)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
     {
         // 創(chuàng)建起點(diǎn):根據(jù) CLPlacemark 地標(biāo)對(duì)象創(chuàng)建 MKPlacemark 地標(biāo)對(duì)象
         MKPlacemark *itemP1 = [[MKPlacemark alloc] initWithPlacemark:beginPlacemark];
         MKMapItem *item1 = [[MKMapItem alloc] initWithPlacemark:itemP1];
    
         // 創(chuàng)建終點(diǎn):根據(jù) CLPlacemark 地標(biāo)對(duì)象創(chuàng)建 MKPlacemark 地標(biāo)對(duì)象
         MKPlacemark *itemP2 = [[MKPlacemark alloc] initWithPlacemark:endPlacemark];
         MKMapItem *item2 = [[MKMapItem alloc] initWithPlacemark:itemP2];
    
         NSDictionary *launchDic = @{
                             // 設(shè)置導(dǎo)航模式參數(shù)
                             MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
                             // 設(shè)置地圖類型
                             MKLaunchOptionsMapTypeKey : @(MKMapTypeHybridFlyover),
                             // 設(shè)置是否顯示交通
                             MKLaunchOptionsShowsTrafficKey : @(YES),
    
                             };
         // 根據(jù) MKMapItem 數(shù)組 和 啟動(dòng)參數(shù)字典 來調(diào)用系統(tǒng)地圖進(jìn)行導(dǎo)航
         [MKMapItem openMapsWithItems:@[item1, item2] launchOptions:launchDic];
     }
    
  3. 注意: CLPlacemark地標(biāo)對(duì)象沒法直接手動(dòng)創(chuàng)建, 只能通過(反)地理編碼獲取

3. 補(bǔ)充

  1. 3D視圖

     補(bǔ)充1:類似于地圖街景,增強(qiáng)用戶體驗(yàn)
     CLLocationCoordinate2D center = CLLocationCoordinate2DMake(23.132931, 113.375924);
     MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:center fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude, center.longitude + 0.001) eyeAltitude:1];
     self.mapView.camera = camera;
    
  2. 地圖截圖

     // 截圖附加選項(xiàng)
     MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
     // 設(shè)置截圖區(qū)域(在地圖上的區(qū)域,作用在地圖)
     options.region = self.mapView.region;
     // options.mapRect = self.mapView.visibleMapRect;
    
     // 設(shè)置截圖后的圖片大小(作用在輸出圖像)
     options.size = self.mapView.frame.size;
     // 設(shè)置截圖后的圖片比例(默認(rèn)是屏幕比例世剖, 作用在輸出圖像)
     options.scale = [[UIScreen mainScreen] scale];
    
     MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
     [snapshotter startWithCompletionHandler:^(MKMapSnapshot * _Nullable snapshot, NSError * _Nullable error) {
     if (error) {
         NSLog(@"截圖錯(cuò)誤:%@",error.localizedDescription);
     }else
     {
         // 設(shè)置屏幕上圖片顯示
         self.snapshootImageView.image = snapshot.image;
         // 將圖片保存到指定路徑(此處是桌面路徑定罢,需要根據(jù)個(gè)人電腦不同進(jìn)行修改)
         NSData *data = UIImagePNGRepresentation(snapshot.image);
         [data writeToFile:@"/Users/Desktop/snap.png" atomically:YES];
     }
     }];
    

4. 測(cè)試環(huán)境

    1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

5. 常見問題總結(jié)

    1. 需要注意地標(biāo)對(duì)象不能手動(dòng)創(chuàng)建, 因?yàn)槔锩娴膶傩允莚eadonly; 只能通過(反)地理編碼獲取

六. 獲取導(dǎo)航路線信息

1. 實(shí)現(xiàn)須知

  1. 獲取導(dǎo)航路線, 需要想蘋果服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求
  2. 記住關(guān)鍵對(duì)象MKDirections

2.代碼實(shí)現(xiàn)

// 根據(jù)兩個(gè)地標(biāo),向蘋果服務(wù)器請(qǐng)求對(duì)應(yīng)的行走路線信息
- (void)directionsWithBeginPlackmark:(CLPlacemark *)beginP andEndPlacemark:(CLPlacemark *)endP
{

    // 創(chuàng)建請(qǐng)求
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];

    // 設(shè)置開始地標(biāo)
    MKPlacemark *beginMP = [[MKPlacemark alloc] initWithPlacemark:beginP];
    request.source = [[MKMapItem alloc] initWithPlacemark:beginMP];

    // 設(shè)置結(jié)束地標(biāo)
    MKPlacemark *endMP = [[MKPlacemark alloc] initWithPlacemark:endP];
    request.destination = [[MKMapItem alloc] initWithPlacemark:endMP];
    
    // 根據(jù)請(qǐng)求旁瘫,獲取實(shí)際路線信息
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {

    [response.routes enumerateObjectsUsingBlock:^(MKRoute * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@--", obj.name);
        [obj.steps enumerateObjectsUsingBlock:^(MKRouteStep * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%@", obj.instructions);
        }];
    }];

}];

}

3. 導(dǎo)航路線對(duì)象詳解

    /** 
     MKDirectionsResponse對(duì)象解析
        source :開始位置
        destination :結(jié)束位置
        routes : 路線信息 (MKRoute對(duì)象)

     MKRoute對(duì)象解析
        name : 路的名稱
        advisoryNotices : 注意警告信息
        distance : 路線長(zhǎng)度(實(shí)際物理距離祖凫,單位是m)
        polyline : 路線對(duì)應(yīng)的在地圖上的幾何線路(由很多點(diǎn)組成,可繪制在地圖上)
        steps : 多個(gè)行走步驟組成的數(shù)組(例如“前方路口左轉(zhuǎn)”酬凳,“保持直行”等等惠况, MKRouteStep 對(duì)象)
     
    MKRouteStep對(duì)象解析
        instructions : 步驟說明(例如“前方路口左轉(zhuǎn)”,“保持直行”等等)
        transportType : 通過方式(駕車宁仔,步行等)
        polyline : 路線對(duì)應(yīng)的在地圖上的幾何線路(由很多點(diǎn)組成稠屠,可繪制在地圖上)
     
    注意:
        MKRoute是一整條長(zhǎng)路;MKRouteStep是這條長(zhǎng)路中的每一截;

     */

4. 測(cè)試環(huán)境

    1. 請(qǐng)求路線數(shù)據(jù)需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

5. 常見問題總結(jié)

    1. 類太多, 記不住咋辦?
        此功能不常用, 只需要知道有這一個(gè)功能. 如果到時(shí)用到, 直接回過頭來找代碼;

七. 繪制導(dǎo)航路線

1. 理論支持

  1. 路線也是一個(gè)覆蓋層
  2. 在地圖上操作覆蓋層,其實(shí)操作的是覆蓋層的數(shù)據(jù)模型
    添加覆蓋層:在地圖上添加覆蓋層數(shù)據(jù)模型
    刪除覆蓋層:在地圖上移除覆蓋層數(shù)據(jù)模型

2. 添加導(dǎo)航路線到地圖

  1. 獲取幾何路線的數(shù)據(jù)模型 (id <MKOverlay>)overlay

  2. 地圖添加覆蓋層(幾何路線也是一個(gè)覆蓋層), 直接添加覆蓋層數(shù)據(jù)模型

     [self.mapView addOverlay:overlay];
    
  3. 設(shè)置地圖代理, 代理遵循協(xié)議 MKMapViewDelegate

  4. 實(shí)現(xiàn)地圖添加覆蓋層數(shù)據(jù)模型時(shí), 回調(diào)的代理方法; 通過此方法, 返回對(duì)應(yīng)的渲染圖層

     - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
     {
         // 創(chuàng)建折線渲染對(duì)象
         if ([overlay isKindOfClass:[MKPolyline class]]) 
         {
             MKPolylineRenderer *lineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
             // 設(shè)置線寬
             lineRenderer.lineWidth = 6;
             // 設(shè)置線顏色
             lineRenderer.strokeColor = [UIColor redColor];
             return lineRenderer;
         }
     }
    

3. 練習(xí): 添加圓形覆蓋層到地圖

  1. 創(chuàng)建圓形區(qū)域覆蓋層的數(shù)據(jù)模型

     MKCircle *circle = [MKCircle circleWithCenterCoordinate:self.mapView.centerCoordinate radius:1000000];
    
  2. 添加覆蓋層數(shù)據(jù)模型

     [self.mapView addOverlay:circle];
    
  3. 實(shí)現(xiàn)代理方法

     -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
     {
         // 創(chuàng)建圓形區(qū)域渲染對(duì)象
         if ([overlay isKindOfClass:[MKCircle class]]) 
         {
             MKCircleRenderer *circleRender = [[MKCircleRenderer alloc] initWithOverlay:overlay];
             circleRender.fillColor = [UIColor cyanColor];
             circleRender.alpha = 0.6;
             return circleRender;
         }
         return nil;
     }
    

4. 測(cè)試環(huán)境

    1. 地圖加載需要聯(lián)網(wǎng)
    2. XCode版本不限
    3. iOS系統(tǒng)版本不限

5. 常見問題總結(jié)

    1. 東西太多, 記不住?
        只需要記得一個(gè)思想, 按照MVC的原則, 我們操作覆蓋層, 就是操作覆蓋層數(shù)據(jù)模型; 然后地圖, 會(huì)調(diào)用其對(duì)應(yīng)的代理方法, 獲取對(duì)應(yīng)的覆蓋層渲染層;
        類記不住沒關(guān)系, 主要記住大致思路就可以.

八. 集成百度地圖

1. 集成原因

1. 有些功能, 系統(tǒng)自帶的高德地圖無法實(shí)現(xiàn), 例如POI檢索等等
2. 一般實(shí)現(xiàn)導(dǎo)航功能, 會(huì)集成百度地圖的比較多;

2. 集成步驟

1. 下載對(duì)應(yīng)的SDK
2. 按照集成文檔一步一步實(shí)現(xiàn)

3. 開發(fā)經(jīng)驗(yàn)

1. 不要把所有的功能全部都寫在控制器當(dāng)中, 最好封裝成一個(gè)單獨(dú)的工具類
2. 如果集成過程中出現(xiàn)問題, 先查看官方文檔

4. 測(cè)試環(huán)境

1. 需要聯(lián)網(wǎng)
2. XCode版本不限
3. iOS系統(tǒng)版本不限

5. 常見問題總結(jié)

按照開發(fā)文檔一步一步做, 一般沒有什么問題; 注意集成細(xì)節(jié)就行.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权埠,一起剝皮案震驚了整個(gè)濱河市榨了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攘蔽,老刑警劉巖龙屉,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秩彤,居然都是意外死亡叔扼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門漫雷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓜富,“玉大人,你說我怎么就攤上這事降盹∮敫蹋” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蓄坏,是天一觀的道長(zhǎng)价捧。 經(jīng)常有香客問我,道長(zhǎng)涡戳,這世上最難降的妖魔是什么结蟋? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮渔彰,結(jié)果婚禮上嵌屎,老公的妹妹穿的比我還像新娘。我一直安慰自己恍涂,他們只是感情好宝惰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再沧,像睡著了一般尼夺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炒瘸,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天淤堵,我揣著相機(jī)與錄音,去河邊找鬼什燕。 笑死粘勒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屎即。 我是一名探鬼主播庙睡,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼事富,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了乘陪?” 一聲冷哼從身側(cè)響起统台,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啡邑,沒想到半個(gè)月后贱勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谤逼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贵扰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片流部。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戚绕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枝冀,到底是詐尸還是另有隱情舞丛,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布果漾,位于F島的核電站球切,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绒障。R本人自食惡果不足惜吨凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望户辱。 院中可真熱鬧怀骤,春花似錦、人聲如沸焕妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焚鹊。三九已至,卻和暖如春韧献,著一層夾襖步出監(jiān)牢的瞬間末患,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工锤窑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璧针,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓渊啰,卻偏偏與公主長(zhǎng)得像探橱,于是被迫代替她去往敵國(guó)和親申屹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • MapKit框架的使用 一. 地圖的基本使用 1. 設(shè)置地圖顯示類型 地圖的樣式可以手動(dòng)設(shè)置, 在iOS9.0之前...
    0271fb6f797c閱讀 325評(píng)論 0 1
  • MapKit框架的使用 一. 地圖的基本使用 1. 設(shè)置地圖顯示類型 地圖的樣式可以手動(dòng)設(shè)置, 在iOS9.0之前...
    iOS_Cqlee閱讀 2,330評(píng)論 1 6
  • 一. 地圖的基本使用 1. 設(shè)置地圖顯示類型 地圖的樣式可以手動(dòng)設(shè)置, 在iOS9.0之前有3種, iOS9.0之...
    走道牙的人閱讀 426評(píng)論 0 1
  • 一. 地圖的基本使用 1. 設(shè)置地圖顯示類型 地圖的樣式可以手動(dòng)設(shè)置, 在iOS9.0之前有3種, iOS9.0之...
    馬戲團(tuán)小丑閱讀 700評(píng)論 0 15
  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 現(xiàn)在很多社交隧膏、...
    JJO閱讀 4,118評(píng)論 4 19