百度地图整体封装大头针

版本迭代需要集成百度地图,产品需求是每个大头针上方都需要固定展示大头针先关的信息,而在集成过程中,如果通过百度原装方法点击大头针,弹出气泡,会出现如下几个问题:

1.可以通过[mapView selectAnnotation:annotation animated:YES]方法在初始化时显示大头针气泡,但是从方法中很容易的看到,如果添加多个大头针,多个都需要初始化展示气泡,而它只能展示最后一个添加大头针的气泡,无法实现产品的需求

2.点击大头针,弹出气泡,点击第二个时第一个大头针的气泡会消失,归结起来就是使用气泡的方式显示大头针相关信息只会显示一条,不能同时显示多条信息

而针对产品的需求,需要显示多条大头针信息,百度地图sdk原装方法行不通,通过查阅相关资料,可以将大头针和气泡封装成一个整体,统一当成大头针使用,并取消点击大头针弹出气泡的方法,这样有一个小问题就是会出现大头针偏移的问题,需要用户根据需要自己调整大头针显示位置,设置偏移量;而如果需要点击大头针进行相关的操作,可以通过在大头针上方添加一个button,设定tag值绑定点击事件,下面是部分代码,可以参考:

在百度地图的代理方法中创建封装大头针

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

{

if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {

BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];

newAnnotationView.backgroundColor = [UIColor clearColor];

newAnnotationView.image = [UIImage imageNamed:@"qiP.png"]; //设置大头针占位图片

newAnnotationView.frame = CGRectMake(-70, -35, 140, 70);   //占位图片为空,需要强制设置大头针的范围

newAnnotationView.userInteractionEnabled = YES;

newAnnotationView.enabled = YES;

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

//气泡view

newAnnotationView.paopaoView = [[BMKActionPaopaoView alloc] initWithCustomView:view];

UIImageView *paoPaoImage = [[UIImageView alloc]init];

paoPaoImage.frame = CGRectMake(-45, -35, 140, 35);

paoPaoImage.image = [UIImage imageNamed:@"qiPao.png"];

[newAnnotationView addSubview:paoPaoImage];

//气泡view上大头针的信息

UILabel *busNameLabel = [[UILabel alloc]initWithFrame:CGRectMake(-35, -35, 50, 30)];

busNameLabel.text =busNameStr;

busNameLabel.textColor = [UIColor whiteColor];

busNameLabel.backgroundColor = [UIColor clearColor];

[newAnnotationView addSubview:busNameLabel];

UILabel *totalNumLab = [[UILabel alloc]initWithFrame:CGRectMake(25, -35, 70, 30)];

totalNumLab.text = bustotalNum;

totalNumLab.textAlignment = NSTextAlignmentCenter;

totalNumLab.textColor = [UIColor colorWithRed:245.0/255 green:153.0/255 blue:38.0/255 alpha:1];

totalNumLab.backgroundColor = [UIColor clearColor];

[newAnnotationView addSubview:totalNumLab];

UIImageView *schoolBusImage = [[UIImageView alloc]init];

schoolBusImage.frame = CGRectMake(0, 0, 50, 50);

schoolBusImage.image = [UIImage imageNamed:@"schoolBus.png"];

[newAnnotationView addSubview:schoolBusImage];

//点击事件的button

UIButton *backgroundBtn = [UIButton buttonWithType:UIButtonTypeCustom];

backgroundBtn.frame = CGRectMake(-15, -10, 70, 70);

backgroundBtn.tag = busTag;

[newAnnotationView addSubview:backgroundBtn];

[backgroundBtn addTarget:self action:@selector(backgroundBtnClick:) forControlEvents:UIControlEventTouchUpInside];

return newAnnotationView;

}

return nil;

}

创建大头针,并设置大头针的数据,必须依次添加大头针到地图上,不能整体添加

for (int i = 0; i < self.schoolLeaderArr.count; i++) {

double schoolBusLatitude = [self.schoolLeaderArr[i][@"latitude"] doubleValue];

double schoolBusLongitude = [self.schoolLeaderArr[i][@"longitude"] doubleValue];

schoolBusLocation = CLLocationCoordinate2DMake(schoolBusLatitude, schoolBusLongitude);

schoolBusAnnotation = [[BMKPointAnnotation alloc]init];

schoolBusAnnotation.coordinate = schoolBusLocation;

busNameStr = [NSString stringWithFormat:@"%@",self.schoolLeaderArr[i][@"busName"]];

bustotalNum = [NSString stringWithFormat:@"%@/%@人",[NSString stringWithFormat:@"%@",self.schoolLeaderArr[i][@"upNum"]],[NSString stringWithFormat:@"%@",self.schoolLeaderArr[i][@"totalNum"]]];

busTag = [self.schoolLeaderArr[i][@"busId"] intValue];

[self.annotationArr addObject:schoolBusAnnotation];

//创建一个大头针,添加一个,防止统一添加代理方法里面数据混乱

[self.mapView addAnnotation:schoolBusAnnotation];

}

时间: 2024-09-29 00:13:03

百度地图整体封装大头针的相关文章

吐槽贴:百度地图 api 封装 的实用功能 [源码下载]

ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐标是否在一个圆圈内,生活服务查询,从经纬度获取地址信息,地图工具包括测距,获取面积,以积打印地图,地图全屏,实时路况,坐标是否在polygon区域内,打车方案,经过中间途经点,添加地图控件: 地图界面: ZMap.js 部分代码说明 /** * 百度地图 api 功能整合 * @author Glo

Extjs4 百度地图

前段时间,开发需要百度地图,底层用Extjs 4.0.7 版本,想进行融合封装下,上网查了很多资料,基本没有Extjs4 封装百度地图的例子,都是直接用的api嵌入页面,这样并不能满足需求. 然后我看了下extjs ux 扩展控件里,有个谷歌地图控件,我便仿照谷歌控件封装了一个百度地图控件,以后只需要对这个百度控件进行扩展就可以了,下面分享下源码,纯手打,纯原创,author:DEMON 首先:在html页面里面要引用百度地图api,我使用的是2.0大众版本. <script type="

百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]

相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐标是否在一个圆圈内,生活服务查询,从经纬度获取地址信息,地图工具包括测距,获取面积,以积打印地图,地图全屏,实时路况,坐标是否在polygon区域内,打车方案,经过中间途经点,添加地图控件: 界面预览 本界面项目由:

百度地图坐标转换服务封装(优化批量并发异步访问)

本人接触网页地图以来已有5年之窗,与百度地图打交道少说也有3年以上了,百度坐标转换从最开始的只支持单组坐标转换到现在的批量转换(限制每次100组),而且是无规律的算法纠偏,根本不好复制这种算法到本地进行转换,每次只能乖乖的ajax get到百度服务接口返回结果. 这种做法对于单组坐标的转换体验上影响不大,但是当我们需要纠偏的坐标量很多的时候,按正常的写法ajax异步请求,而且每次最多只能传入100组坐标,只能分批来调,而且是异步处理,还要定义一堆全局变量记住状态值,代码量多且复杂,项目大就难以管

【Android】代理模式封装百度地图路线规划模块

百度地图的Demo里有个路线规划的功能,但是,这个功能和Activity耦合性太高,所以需要单独抽离出路径规划功能,进行"解耦". 注:由于项目原因,本文只针对驾车路线规划进行封装. 首先,定义RoutePlan类,这个类就是路线规划类,既然是路线规划,所以要实现OnGetRoutePlanResultListener接口,路线规划需要的三个参数作为它的成员,即城市city.起点start.终点end. 然后,由于需要搜索,所以对外提供搜索接口: public void driving

总结一下百度地图 定位 大头针 和划线和城市检索的功能

- (void)viewDidLoad {    [super viewDidLoad];          //初始化BMKLocationService    _locService = [[BMKLocationService alloc]init];    _locService.delegate = self;    //启动LocationService [_locService startUserLocationService]; } 在delegate中更新位置和对应方向 #pr

IOS百度地图之---&gt;第二篇《大头针__简单使用及自定义》

呵呵!大家不要只看帖不回帖么,要不然我都没有积极性了. 第一步:创建一个用来呈现mapview的viewcontroller,不废话直接贴代码 ? ? ? ?BasicMapViewController需要在该类中加入地图的代理并实现相关事件 //? ? 34.2778000000,108.9530980000 ? 数据来源http://www.gpsspg.com/maps.htm #define xian? ? ? ? ? ? CLLocationCoordinate2DMake(34.22

iOS第三方地图-百度地图定位的封装

// // BaiduMapTools.h // baidumapTest // // Created by apple on 15/8/26. // Copyright (c) 2015年 tqh. All rights reserved. // #import <Foundation/Foundation.h> @interface WJBaiduMapTools : NSObject /**单例*/ +(WJBaiduMapTools *)instance; /**定位,能得到省市街道*

IOS百度地图使用基础指南+原生分享&友盟分享

1.地图 1.获取用户的经纬度(CLLocationManager) 创建属性:CLLocationManager *mgr; 遵守协议:<CLLocationManagerDelegate> a>创建定位管理器 self.mgr = [[CLLocationManager alloc] init]; b>设置代理 self.mgr.delegate = self; c>开始定位 [self.mgr startUpdatingLocation]; 代理方法: -(void)l