iOS 百度地图2-定位,自定义标注

地图的定位需要使用 BMKLocationService这个类,并遵循BMKLocationServiceDelegate代理

1 基本定位

1.1 声明

@property (nonatomic, strong) BMKLocationService *locService;

1.2 在 viewDidLoad 中初始化

_locService = [[BMKLocationService alloc]init];

1.3 同样设置代理,管理内存

-(void)viewWillAppear:(BOOL)animated
{
    [_mapView viewWillAppear];
    _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    _locService.delegate = self;
}
-(void)viewWillDisappear:(BOOL)animated
{
    [_mapView viewWillDisappear];
    _mapView.delegate = nil; // 不用时,置nil
    _locService.delegate = nil;
}

1.4 在点击方法中,启动定位服务

- (void)position {
    //是否显示定位小蓝点,设置为no不显示,可以自定义(这里显示前提要遵循代理方法,不可缺少)
    _mapView.showsUserLocation = YES;

    //启动LocationService
    _mapView.zoomLevel = 14.1; //地图等级,数字越大越清晰
    _mapView.userTrackingMode = BMKUserTrackingModeNone;//设定定位模式
    [_locService startUserLocationService];
}

1.5 在 BMKLocationService 的代理方法中实现定位

//用户位置更新后,会调用此函数
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation {
    NSLog(@"当前位置%f,%f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);

    // 显示定位点 必须设置地图的中心点,地图才会切换显示到定位位置
    _mapView.centerCoordinate = userLocation.location.coordinate;
    //设置缩放比例,不设置一次,测试第一次定位时中心总显示在天安门
    _mapView.zoomLevel = 14.1;

    [_mapView updateLocationData:userLocation];
    [_locService stopUserLocationService];
}

此时就可以定位,并显示小蓝点了。

定位.PNG

2 问题处理

过程中遇到无法显示定位小蓝点的问题,可能原因:

2.1 info.plist 权限未加

Privacy - Location When In Use Usage Description 允许App在使用时获取GPS的描述
Privacy - Location Always Usage Description 允许永久使用GPS的描述

2.2 若是手动导入的SDK,没有用cocoapods,检查有没有导入mapapi.bundle,这是百度默认的素材包,小蓝点图片在这里面。

以上真机测试就正常了。

2.3 使用模拟器没有定位。

重置模拟器。
若还没有,则可以尝试下面操作,将None改为以下任意一项

模拟器定位.jpeg

2.4 使用模拟器位置不准确,帝都定位到米国,目前没有找到方法,欢迎留言补充。

3 自定义标注-定位图片

一般产品都会要求定位图片使用自己设计的图片,这是就需要用到自定义标注了。
这时应先把系统小蓝点的显示改NO : _mapView.showsUserLocation = NO;
然后来区别2个类:
BMKPointAnnotation:官方解释的是一个点的标注,也就是定位的小蓝点所指代的位置,具有地理的经纬度特性。
BMKAnnotationView:官方解释标注视图,也就是指代那个位置的小蓝点,如果想换图片,则就应该在BMKAnnotationView内部添加image。

3.1 切换小蓝点图片

3.1.1 创建 AnnotionView1 类 继承 BMKAnnotationView,重写 initWithAnnotation 方法,在其中实现自定义UI。
#import <BaiduMapAPI_Map/BMKMapView.h>//只引入所需的单个头文件

@interface AnnotionView1 : BMKAnnotationView
@property (nonatomic, strong) UIImageView *bgImageView;
@end
- (id)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        
        //--------------------------自定义标注视图-------------------------------
        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
        self.centerOffset = CGPointMake(0, 0);
        self.frame = CGRectMake(0, 0, 32, 32);
        
        _bgImageView = [[UIImageView alloc]initWithFrame:self.frame];
        _bgImageView.image = [UIImage imageNamed:@"cl_cell_selected"];
        [self addSubview:_bgImageView];
        //--------------------------------------------------------------------
    }
    return self;
}
3.1.2 声明一个 BMKPointAnnotation变量,并在didUpdateBMKUserLocation 中初始化
@property (nonatomic, strong) BMKPointAnnotation *pointAnnotation;

- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation {
    NSLog(@"当前位置%f,%f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
    
    // 显示定位点 必须设置地图的中心点,地图才会切换显示到定位位置
    _mapView.centerCoordinate = userLocation.location.coordinate;
    //设置缩放比例,不设置一次,测试第一次定位时中心总显示在天安门
    _mapView.zoomLevel = 14.1;
    
    [_mapView updateLocationData:userLocation];
    [_locService stopUserLocationService];
    
    // ------------------自定义标注-------------------------------------
    _pointAnnotation = [[BMKPointAnnotation alloc]init];
    _pointAnnotation.coordinate = userLocation.location.coordinate;
    [_mapView addAnnotation:_pointAnnotation];
    [_mapView selectAnnotation:_pointAnnotation animated:YES];
    // 设置气泡内容,不设置则不显示气泡
    _pointAnnotation.title = @"我在这里";
    _pointAnnotation.subtitle = @"公司";
    // ----------------------------------------------------------------------
}
3.1.3 实现生成对应标注视图的代理方法 viewForAnnotation
注意:此方法只有在执行了 [_mapView addAnnotation:_pointAnnotation] 后才会调用。
static  NSString *myLocationViewID = @"myID";

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation {
    
    AnnotionView1 *newAnnotationView = (AnnotionView1 *)[mapView dequeueReusableAnnotationViewWithIdentifier:myLocationViewID];
    if (newAnnotationView == nil) {
        newAnnotationView = [[AnnotionView1 alloc] initWithAnnotation:annotation reuseIdentifier:myLocationViewID];
    }
    return newAnnotationView;
}
自定义标注.PNG

3.2 自定义气泡

上图显示的 我在这里.. 就是气泡,点击地图其他地方会消失,点击定位点会出现,这是系统默认的,现在自定义样式。
paopaoView是BMKAnnotationView的一个属性,它就是点击触发的气泡视图。在上述重写BMKAnnotationView的 initWithAnnotation方法中自定义。

- (id)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        
        //--------------------------自定义标注视图-------------------------------
        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
        self.centerOffset = CGPointMake(0, 0);
        self.frame = CGRectMake(0, 0, 32, 32);
        
        _bgImageView = [[UIImageView alloc]initWithFrame:self.frame];
        _bgImageView.image = [UIImage imageNamed:@"cl_cell_selected"];
        [self addSubview:_bgImageView];
        //--------------------------------------------------------------------
        
        //--------------------------自定义气泡视图-------------------------------
        UIImageView *paoImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 13, 24, 24)];
        paoImg.image =[UIImage imageNamed:@"tabbar_shouye_selected"];
        
        UILabel *paoLbl = [[UILabel alloc]initWithFrame:CGRectMake(30, 0, 70, 50)];
        paoLbl.text = @"御书房";
        paoLbl.textColor = [UIColor whiteColor];
        paoLbl.font = [UIFont systemFontOfSize:15];
        
        UIView *paopao = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
        paopao.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];
        [paopao addSubview:paoImg];
        [paopao addSubview:paoLbl];
        self.paopaoView = [[BMKActionPaopaoView alloc]initWithCustomView:paopao];
        //--------------------------------------------------------------------
    }
    return self;
}
自定义气泡.PNG

我们什么时候重写BMKPointAnnotation呢,一般来说他只是传个地理位置信息,当我们在地图上想要显示多个地理位置信息的时候,比如后台返回来一个数组,里面每个元素都是一个字典,每个字典代表一个单位,除了地理位置信息,还有其他信息,比如名字,图片等,对应的是每个地理位置,这时候重写BMKPointAnnotation,并在其中定义一个model属性,用来接收后台返回来的model信息串。然后声明这个pointAnnotation类的对象,并给他赋值后台返回来的model信息串中的位置信息,并将整个model传给他,后面的操作和上面的步骤一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容