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

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";

    // 1.从缓存池中取
    MyAnnotationView *annoView = (HXAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    // 2.如果缓存池中没有, 创建一个新的
    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:anno];
//或者使用,annos是标注数组
[_mapView addAnnotations:annos];

之后在调用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 *)view;

我在开发过程中,调用上面的方法并没有作用,所以我在自定义的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];
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值