04 将当前位置用大头针标注到百度地图上

O 需求

将当前位置用大头针标注到百度地图上

一 准备

详见《01 如何将百度地图加入IOS应用程序?》

注意,此应用程序运行环境是IOS DEVICE 。所以,相应的开发包一定要做好调整。

二 编码

(New标示本次新添加的代码;Delete表示本次需要删除的代码;Modify表示本次被修改的代码)

1、在ViewController.h中修改代码如下

#import 
#import "BMapKit.h"
@interface ViewController : UIViewController
{
        BMKMapManager *_mapManager;                          //声明一个地图管理
        BMKMapView *_mapView;                                 //声明一张地图
        BMKPointAnnotation *_annotation;                         //声明一个标注
}
@end

在ViewController.m中添加如下代码

- (void)viewDidLoad
{
    [superviewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
   
    //启动BMKMapManager
    _mapManager = [[BMKMapManageralloc]init];
    BOOL ret = [_mapManagerstart:@"2772BD5CAFF652491F65707D6D5E9ABEBF3639CC"generalDelegate:self];
    if (!ret) {
        NSLog(@"manager start failed!");
    }
   
    //创建一张百度地图
    _mapView = [[BMKMapViewalloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    [_mapViewsetShowsUserLocation:YES];               //开启定位功能
    _mapView.delegate = self;
    [self.viewaddSubview:_mapView];
   
    // 在地图中添加一个PointAnnotation
    _annotation = [[BMKPointAnnotationalloc]init];
    _annotation.title = @"test";
    _annotation.subtitle = @"this is a test!";
    [_mapViewaddAnnotation:_annotation];      //个人猜测,当执行此句代码时,将会调用- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id )annotation方法
}
 
#pragma mark -  实现 BMKMapViewDelegate 中的方法
 
/**
 在地图View将要启动定位时,会调用此函数
 @param mapView 地图View
 下面的这个方法,貌似并没有被启动啊?是否是可有可无的?
 */
- (void)mapViewWillStartLocatingUser:(BMKMapView *)mapView
{
     NSLog(@"start locate");
}
 
/**
     用户位置更新后,会调用此函数
     @param mapView 地图View
     @param userLocation 新的用户位置
    在实际使用中,只需要    [mapView setShowsUserLocation:YES];    mapView.delegate = self;   两句代码就可以启动下面的方法。疑问,为什么我的位置没有移动的情况下,这个方法循环被调用呢?
 */
- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation
{
     if (userLocation != nil) {
       NSLog(@"%f %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
 
        //将地图移动到当前位置
        float zoomLevel = 0.02; 
        BMKCoordinateRegion region = BMKCoordinateRegionMake(userLocation.location.coordinate,BMKCoordinateSpanMake(zoomLevel, zoomLevel)); 
        [_mapViewsetRegion:[_mapViewregionThatFits:region] animated:YES];
       
        //大头针摆放的坐标,必须从这里进行赋值,否则取不到值,这里可能涉及到委托方法执行顺序的问题
        CLLocationCoordinate2D coor;
        coor.latitude = userLocation.location.coordinate.latitude;
        coor.longitude = userLocation.location.coordinate.longitude;
        _annotation.coordinate = coor;
     }
}
 
/**
     定位失败后,会调用此函数
     @param mapView 地图View
     @param error  错误号,参考CLError.h中定义的错误号
 */
- (void)mapView:(BMKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
 
{
     if (error != nil)
       NSLog(@"locate failed: %@", [error localizedDescription]);
     else {
       NSLog(@"locate failed");
     }
}
 
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id )annotation
{
     if ([annotation isKindOfClass:[BMKPointAnnotationclass]]) {
       BMKPinAnnotationView *newAnnotation = [[BMKPinAnnotationViewalloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];                 //初始化一个大头针标注
        NSLog(@"I'm coming!");
       newAnnotation.pinColor = BMKPinAnnotationColorPurple;  
       newAnnotation.animatesDrop = YES;
       newAnnotation.draggable = YES;
       return newAnnotation;  
     }
     returnnil;
}

执行后,效果如下:


四 下载          ......去下载源码咯 ......

五 思路

六 分析

用到的类:

BMKMapManager(配合BMKMapView

使用,用于启动一张地图

BMKMapView

BMKCoordinateRegion (配合BMKMapView

使用,用于设置地图显示的范围和边界)

BMKCoordinateRegionMake(配合BMKCoordinateRegion进行使用,用于创建一个BMKCoordinateRegion对象)

 

BMKPointAnnotation

CLLocationCoordinate2D

配合BMKPointAnnotation使用,用于设置大头针显示的位置)

 

用到的方法:

用户位置更新后,会调用此函数

- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation

//根据anntation生成对应的View

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation

 

七 疑问

1)        以上委托方法的触发时机和执行顺序是什么?(这个问题必须解决,这个问题关系到大头针是否显示,何时显示的问题。)


你可能感兴趣的:(IOS,地图)