MapKit框架的使用

一. 地圖的基本使用

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

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

  2. 設(shè)置方式

     self.mapView.mapType = MKMapTypeStandard;
    
    枚舉類型 對應(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è)置地圖控制項

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

  2. 設(shè)置方式

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

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

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

  2. 設(shè)置方式

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

4. 顯示用戶位置

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

  2. 設(shè)置方式

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

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

4. 測試環(huán)境

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

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

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

二. 地圖的中級使用

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

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

  2. 實現(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ū)域跨度

     實現(xiàn)當(dāng)?shù)貓D區(qū)域發(fā)生改變時調(diào)用的代理代理方法, 并調(diào)整地圖區(qū)域到合適比例, 并在對應(yīng)的方法中, 獲取對應(yīng)的跨度信息
     代碼如下:
         - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
         {
             NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
         }
    
  2. 創(chuàng)建一個區(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:緯度跨度,因為南北緯各90.0度侣夷,所以此值的范圍是(0.0---180.0)横朋;此值表示,整個地圖視圖寬度百拓,顯示多大跨度;
         
         longitudeDelta:經(jīng)度跨度琴锭,因為東西經(jīng)各180.0度,所以此值范圍是(0.0---360.0):此值表示耐版,整個地圖視圖高度祠够,顯示多大跨度;
         
         注意:地圖視圖顯示压汪,不會更改地圖的比例粪牲,會以地圖視圖高度或?qū)挾容^小的那個為基準(zhǔn),按比例調(diào)整
    

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

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

5. 測試環(huán)境

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

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

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

三. 地圖高級-大頭針基本使用

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

按照MVC的原則
*  在地圖上操作大頭針,實際上是控制大頭針數(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 = @"小碼哥";
     annotation.subtitle = @"小碼哥分部";
    
  3. 調(diào)用地圖的添加大頭針數(shù)據(jù)模型方法

     [self.customMapView addAnnotation:annotation];
    

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

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

4. 場景模擬

  1. 場景描述:

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

     1. 獲取觸摸點在地圖上對應(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 = @"小碼哥";
         annotation.subtitle = @"小碼哥分部";
         [self.customMapView addAnnotation:annotation];
     
     4. 利用反地理編碼, 獲取該點對應(yīng)的城市和街道名稱, 然后修改大頭針數(shù)據(jù)模型
         注意: 設(shè)置彈框數(shù)據(jù)時, 對應(yīng)的大頭針數(shù)據(jù)模型應(yīng)有對應(yīng)的占位數(shù)據(jù)(這樣對應(yīng)的UI才會生成,后面才能重新修改數(shù)據(jù))
    

5. 測試環(huán)境

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

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

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

四. 地圖高級-大頭針的自定義

1. 理論支撐

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

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

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

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

     1. 大頭針系統(tǒng)對應(yīng)的視圖是 MKPinAnnotationView落君,它繼承自 MKAnnotationView
     2. 地圖上的大頭針視圖,和tableview上的cell一樣亭引,都使用“循環(huán)利用”的機(jī)制
    
  3. 實現(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. 實現(xiàn)當(dāng)添加大頭針數(shù)據(jù)模型時,地圖回調(diào)的代理方法

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

     1. 如果想要自定義大頭針, 必須使用 MKAnnotationView 或者 自定義的子類
     2. 但是不能直接使用系統(tǒng)默認(rèn)的大頭針, 會無效
    
  3. 實現(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. 代理方法補充

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

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

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

5. 測試環(huán)境

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

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

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

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

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

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

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

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

  2. 代碼如下:

     // 根據(jù)兩個地標(biāo)對象進(jìn)行調(diào)用系統(tǒng)導(dǎo)航
     - (void)beginNavWithBeginPlacemark:(CLPlacemark *)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
     {
         // 創(chuàng)建起點:根據(jù) CLPlacemark 地標(biāo)對象創(chuàng)建 MKPlacemark 地標(biāo)對象
         MKPlacemark *itemP1 = [[MKPlacemark alloc] initWithPlacemark:beginPlacemark];
         MKMapItem *item1 = [[MKMapItem alloc] initWithPlacemark:itemP1];
    
         // 創(chuàng)建終點:根據(jù) CLPlacemark 地標(biāo)對象創(chuàng)建 MKPlacemark 地標(biāo)對象
         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ù)組 和 啟動參數(shù)字典 來調(diào)用系統(tǒng)地圖進(jìn)行導(dǎo)航
         [MKMapItem openMapsWithItems:@[item1, item2] launchOptions:launchDic];
     }
    
  3. 注意: CLPlacemark地標(biāo)對象沒法直接手動創(chuàng)建, 只能通過(反)地理編碼獲取

3. 補充

  1. 3D視圖

     補充1:類似于地圖街景绎速,增強(qiáng)用戶體驗
     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. 地圖截圖

     // 截圖附加選項
     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(@"截圖錯誤:%@",error.localizedDescription);
     }else
     {
         // 設(shè)置屏幕上圖片顯示
         self.snapshootImageView.image = snapshot.image;
         // 將圖片保存到指定路徑(此處是桌面路徑焙蚓,需要根據(jù)個人電腦不同進(jìn)行修改)
         NSData *data = UIImagePNGRepresentation(snapshot.image);
         [data writeToFile:@"/Users/wangshunzi/Desktop/snap.png" atomically:YES];
     }
     }];
    

4. 測試環(huán)境

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

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

    1. 需要注意地標(biāo)對象不能手動創(chuàng)建, 因為里面的屬性是readonly; 只能通過(反)地理編碼獲取

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

1. 實現(xiàn)須知

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

2.代碼實現(xiàn)

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

    // 創(chuà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ù)請求,獲取實際路線信息
    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)航路線對象詳解

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

     MKRoute對象解析
        name : 路的名稱
        advisoryNotices : 注意警告信息
        distance : 路線長度(實際物理距離购公,單位是m)
        polyline : 路線對應(yīng)的在地圖上的幾何線路(由很多點組成萌京,可繪制在地圖上)
        steps : 多個行走步驟組成的數(shù)組(例如“前方路口左轉(zhuǎn)”,“保持直行”等等宏浩, MKRouteStep 對象)
     
    MKRouteStep對象解析
        instructions : 步驟說明(例如“前方路口左轉(zhuǎn)”知残,“保持直行”等等)
        transportType : 通過方式(駕車,步行等)
        polyline : 路線對應(yīng)的在地圖上的幾何線路(由很多點組成比庄,可繪制在地圖上)
     
    注意:
        MKRoute是一整條長路求妹;MKRouteStep是這條長路中的每一截;

     */

4. 測試環(huán)境

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

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

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

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

1. 理論支持

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

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

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

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

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

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

     - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
     {
         // 創(chuàng)建折線渲染對象
         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. 實現(xiàn)代理方法

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

4. 測試環(huán)境

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

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

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

八. 集成百度地圖

1. 集成原因

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

2. 集成步驟

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

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

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

4. 測試環(huán)境

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

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

按照開發(fā)文檔一步一步做, 一般沒有什么問題; 注意集成細(xì)節(jié)就行.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佳窑,一起剝皮案震驚了整個濱河市制恍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌神凑,老刑警劉巖吧趣,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耙厚,居然都是意外死亡强挫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門薛躬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俯渤,“玉大人,你說我怎么就攤上這事型宝“私常” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵趴酣,是天一觀的道長梨树。 經(jīng)常有香客問我,道長岖寞,這世上最難降的妖魔是什么抡四? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上指巡,老公的妹妹穿的比我還像新娘淑履。我一直安慰自己,他們只是感情好藻雪,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布秘噪。 她就那樣靜靜地躺著,像睡著了一般勉耀。 火紅的嫁衣襯著肌膚如雪指煎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天便斥,我揣著相機(jī)與錄音贯要,去河邊找鬼。 笑死椭住,一個胖子當(dāng)著我的面吹牛崇渗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播京郑,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼宅广,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了些举?” 一聲冷哼從身側(cè)響起跟狱,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎户魏,沒想到半個月后驶臊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡叼丑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年关翎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠信。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星立,到底是詐尸還是另有隱情爽茴,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布绰垂,位于F島的核電站室奏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劲装。R本人自食惡果不足惜胧沫,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琳袄,春花似錦、人聲如沸纺酸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽餐蔬。三九已至碎紊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間樊诺,已是汗流浹背仗考。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留词爬,地道東北人秃嗜。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像顿膨,于是被迫代替她去往敵國和親锅锨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

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