ios百度地图开发之显示标注

作者: hrscy | 来源:发表于2015-12-22 14:13 被阅读2205次

demo 地址

MyAnnotation.h文件

#import <Foundation/Foundation.h>
#import <BaiduMapAPI_Map/BMKPointAnnotation.h>
@interface MyAnnotation : BMKPointAnnotation
/** 
 * 图标 
 */
@property (nonatomic, copy) NSString *icon;
@end

MyAnnotation.m文件

#import "MyAnnotation.h"
@implementation MyAnnotation

@end

MyAnnotationView.h文件

#import <BaiduMapAPI_Map/BMKMapView.h>
#import <BaiduMapAPI_Map/BMKAnnotationView.h>
@interface MyAnnotationView : BMKAnnotationView
/**
 * 创建方法 
 *
 *  @param mapView 地图
 *
 *  @return 大头针 
*/
+ (instancetype)annotationViewWithMap:(BMKMapView *)mapView;
@end

MyAnnotationView.m文件

#import "MyAnnotationView.h"
#import "MyAnnotation.h"@implementation MyAnnotationView
- (instancetype)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{ 
  if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) { 
  }
  return self;
}
+ (instancetype)annotationViewWithMap:(BMKMapView *)mapView{ 
  static NSString *identifier = @"anno"; 
  // 从缓存池中取 MyAnnotationView *annoView = (HXAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 
  // 如果缓存池中没有, 创建一个新的 
  if (annoView == nil) { 
    annoView = [[MyAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:identifier]; 
  } 
  return annoView;
}
- (void)setAnnotation:(MyAnnotation *)annotation{ 
  [super setAnnotation:annotation]; 
  //设置图标 
  self.image = [UIImage imageNamed:@"icon_green"];
}
@end

之后在控制器文件中,首先要先从服务器获取数据,取到数据后,根据经纬度坐标,也就是一个个的Annotation显示到地图上.

//可以使用,anno是标注
[_mapView addAnnotation:_mapView.annotations];
//或者使用,annos是标注数组
[_mapView addAnnotations:_mapView.annotations];

之后在调用BMKMapViewDelegate的方法:

#pragma mark -BMKMapViewDelegate
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation{ 
    // 对用户当前的位置的大头针特殊处理 
    if ([annotation isKindOfClass:[HXAnnotation class]] == NO) {
    return nil;
 }
  // 创建大头针 
  MyAnnotationView *annoView = [MyAnnotationView annotationViewWithMap:mapView]; 
  // 设置模型 
  annoView.annotation = annotation; 
  self.anno = annotation; 
  //初始化泡泡视图 
  DetailsView *detailView = [[[NSBundle mainBundle]loadNibNamed:@"HXDetailsView" owner:nil options:nil] lastObject]; 
  //显示到paopaoView上 
  annoView.paopaoView = [[BMKActionPaopaoView alloc] initWithCustomView:detailView]; 
  // 返回大头针
  return annoView;
}

才能将annoView显示到地图上.
如果是自定义的paopaoView,BMKMapViewDelegate会有如下方法:

-(void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)

我在开发过程中,调用上面的方法并没有作用,所以我在自定义的paopaoView里添加了一个按钮,盖满整个paopaoView,之后添加一个按钮的点击事件,以此来响应泡泡的点击,但是如果有很多的标注,需要最点击的泡泡遍历,否则则不能知道点击的是哪个泡泡. 我根据从服务器获取的数据,服务器返回了有关标注的ID,把这个ID设置为paopaoView上按钮的tag值,然后根据按钮tag值来判断点击的是哪个paopaoView.如下代码:

#pragma mark paopao按钮点击
- (void)detailBtnClick:(UIButton *)button{
 //self.annotations是标注数组
 for (int i = 0; i < self.annotations.count; i++) {
   HXMenDList *menDList = self.annotations[i];
   if (button.tag == [menDList.shopId integerValue]) {
   HXDetailsController *detailsV = [[HXDetailsController alloc] init];
 detailsV.menDList = menDList;
   detailsV.coordinate = self.userLocation.location.coordinate;
   [self.navigationController pushViewController:detailsV animated:YES];
   }
 }
}

相关文章

网友评论

  • AllenZYQ://可以使用,anno是标注
    [_mapView addAnnotation:_mapView.annotations];
    //或者使用,annos是标注数组
    [_mapView addAnnotations:_mapView.annotations];
    大量数据 比如上千条的时候 就会卡。 不知道lz大大怎么解决的。。
    AllenZYQ:@hrscy 好的 谢谢
    hrscy:@AllenZYQ https://github.com/hrscy/BaiduMapDemo
    参考一下我写的这个 demo 吧
  • alelaile:你好 为问下 百度sdk里面 每个标注的点击事件 如何获取啊
    hrscy:@alelaile 根据惟一标识,比如某个模型的 id,设置 button 的 tag 或者 title,title 设置为透明颜色的,button 覆盖整个泡泡,这样就可以实现。
    alelaile:@hrscy 一个泡泡可以添加点击 可是多个泡泡 如何分别点击事件呢 它这个是没有下标的 我要做的和膜拜单车类似 一个范围了 显示多个泡泡,点击 显示路线
    hrscy:我以前的做法是自定义弹出泡泡,在泡泡上添加爱一个按钮,为这个按钮添加点击事件,来响应点击了哪个按钮,百度地图的 selected 代理方法我没用,但觉代理方法不太好用。
  • 木木123456:icon是在哪用到的
  • 217f420bfc40:这里的代码是不是不太全啊??HXAnnotation哪里来的啊??
  • 217f420bfc40:MyAnnotationView.m 中从缓存池中取出MyAnnotationView不应该注释吧???
  • 懋澍:self.mapView.delegate 要写在请求数据后么
    懋澍:@hrscy 好的 谢谢
    hrscy:@懋澍 写在 viewWillAppear 里面
  • 懋澍:你好 从服务器获取数据后 添加标注 ,显示不是自己定义的。顺序又问题么
    hrscy:@懋澍 如果从服务器上获取的数据,会根据返回的顺序加入到地图上

本文标题:ios百度地图开发之显示标注

本文链接:https://www.haomeiwen.com/subject/daamhttx.html