对于项目中遇到的高德地图标注问题,本人差点没有把十万个为什么给问个10万次。先说一下自己遇到的问题:

在地图加载完成后自动弹出 自定义的标注点 和 气泡框,然后当点击气泡框的时候,可以直接响应气泡框上的Button事件。

跟一些人一样,开始在网上查找相关的一些帖子,结果基本上都说的一些无关重要的。想想也是心塞塞,没办法,自己写demo测试,然后就写得让自己开始怀疑人生了。
好了废话不多说。直接上代码了。希望下次有人遇到会避免这个坑。

一、手动配置高德地图SDK。

这里是自己直接手动配置SDK,当然有一些麻烦。没办法,网络差,cocoapods又半天下不来。这里就说一些手动配置的步骤,其实更直接一点就去高德开发者中心去查看文档,有相当细的环节配置。高德SDK下载位置:(http://lbs.amap.com/api/ios-sdk/download/)
下载完以后,直接拉入项目中自己需要的包,当然这里本人就只拉了三个需要的包:AMap3DMap、AMapFoundation、AmapLocation。
包创建好了,当然还没有完。继续手动添加依赖库,如果不添加依赖库编译不会成功,你就会看到无数个红色警告。然后找到工程。

添加完这个依赖库以后,再次编辑,嗯,没问题了。可以一下步了。

二、配置高德apiKey

关于高德的api,首先是需要账号的,so,没有账号就先注册一个,然后在控制台里去创建”我的应用”设置app的信息,提交以后会自动生成一个apiKey,复制保存这个key。在项目工程中会用到。这里说明一下。Bundle ID需要跟项目中的Bundle Identifier一致。因为一个key只能对应一个ID

三、配置AppDelegate

在AppDelegate.m文件中,先导入第三方库AMapFoundationKit/AMapFoundationKit.h然后在下面的方法中调用AMapServices 这个类,添加上之前申请的Key。
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
[AMapServices sharedServices].apiKey = @”xxxxxxxxxxxxxxxxxx”;
- }
工程到这里基本上就配置完成了,接下来可以开始愉快的写代码了。

四、创建地图

我在需要添加地图的控制器上,先在头部导入了需要的三方库MAMapKit/MAMapKit.h、AMapFoundationKit/AMapFoundationKit.h、AMapLocationKit/AMapLocationKit.h 然后再添加需要遵从的代理:MAMapViewDelegate、AMapLocationManagerDelegate。

接着,初始化地图,让地图默认加载到视图控制器上,

self.mapView = [[MAMapView alloc]initWithFrame:self.view.bounds];//追踪模式
self.mapView.userTrackingMode = MAUserTrackingModeFollowWithHeading;
//地图类型
self.mapView.mapType = MAMapTypeStandard;
//遵循代理
self.mapView.delegate = self;
//不显示自己位置
self.mapView.showsUserLocation = NO;
[self.view addSubview: self.mapView];//把地图添加至view

到这里结束,运行工程就能愉快的跑起来了。会在界面上直接显示坐标为北京为中心的地图

五、显示自定义标注

这里就不再写关于系统自定义标注的创建方法,可以直接到高德官方文档去查看。关于标注,它的原理就是先有地图,再在地图上加载标注。高德SDK里有封装好了的一个类:MAPointAnnotation,在前面我调用了这个类,并且创建成了属性。所以直接初始化就行了。

 self.pointAnnotaion = [[MAPointAnnotation alloc]init];//设置标题self.pointAnnotaion.title = @"酒店极品";//设置副标题self.pointAnnotaion.subtitle = @"蓝鲸鱼待久大酒店蓝鲸鱼待久大酒店蓝鲸鱼待久大酒店";//设置经纬度CLLocationCoordinate2D coordinate = {30.6594620000,104.0657350000};//设置地图中心点self.mapView.centerCoordinate = coordinate;//设置标注点的位置self.pointAnnotaion.coordinate = coordinate;//地图放大级别self.mapView.zoomLevel = 17;[self.mapView addAnnotation:self.pointAnnotaion];

既然创建了标注,前面说需要加载自定义气泡,那也就需要去重写构造。调用下面的这个方法:

CustomAnnotationView是关于气泡的自定义样式,因为气泡本来是创建在标注的视图层上,所以在创建的时候需要去继承:MAAnnotationView这个类

在CustomAnnotationView.m文件里加载自定义气泡样式的CustomCalloutView,并且将数据传递给气泡CustomCalloutView上需要显示的label字符串。

创建自定义气泡View

在 .h 文件中创建需要传值的字符串、图片和按钮

在.m文件里实现自定义View的样式

#import "CustomCalloutView.h"
#define kArrorHeight        10
#define kTitleWidth         200
#define kTitleHeight        20#define COLOR(R, G, B, A) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A]
@interface CustomCalloutView()
@property (nonatomic, strong) UILabel *subtitleLabel;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIImageView *pointImge;
@end
@implementation CustomCalloutView
//创建气泡背景样式
- (void)drawRect:(CGRect)rect
{
[self drawInContext:UIGraphicsGetCurrentContext()];
self.layer.shadowColor = [[UIColor blackColor] CGColor];
self.layer.shadowOpacity = 0.2;
self.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}
- (void)drawInContext:(CGContextRef)context
{
CGContextSetLineWidth(context, 2.0);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
[self getDrawPath:context];
CGContextFillPath(context);
}
- (void)getDrawPath:(CGContextRef)context
{
CGRect rrect = self.bounds;
CGFloat radius = 6.0;
CGFloat minx = CGRectGetMinX(rrect),
midx = CGRectGetMidX(rrect),
maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect),
maxy = CGRectGetMaxY(rrect)-kArrorHeight;CGContextMoveToPoint(context, midx+kArrorHeight, maxy);
CGContextAddLineToPoint(context,midx, maxy+kArrorHeight);
CGContextAddLineToPoint(context,midx-kArrorHeight, maxy);CGContextAddArcToPoint(context, minx, maxy, minx, miny, radius);
CGContextAddArcToPoint(context, minx, minx, maxx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, maxx, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
CGContextClosePath(context);
}- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{self.backgroundColor = [UIColor clearColor];[self initSubViews];
}
return self;
}
//自定义样式
- (void)initSubViews
{
// 添加图片,即商户图
self.pointImge = [[UIImageView alloc]initWithFrame:CGRectMake(10, 20, 16, 18)];
//    self.pointImge.backgroundColor = COLOR(102, 102, 102, 1.0);
[self addSubview:self.pointImge];// 添加标题,即商户名
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(35, 8, kTitleWidth, kTitleHeight)];
self.titleLabel.font = [UIFont boldSystemFontOfSize:12];
self.titleLabel.textColor = COLOR(102, 102, 102, 1.0);
//    self.titleLabel.text = @"titletitletitletitle";
[self addSubview:self.titleLabel];// 添加副标题,即商户地址
self.subtitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(35 ,5, kTitleWidth, kTitleHeight+30)];
self.subtitleLabel.numberOfLines = 0;//表示label可以多行显示
self.subtitleLabel.font = [UIFont boldSystemFontOfSize:12];
self.subtitleLabel.textColor = COLOR(51, 51, 51, 1.0);
//    self.subtitleLabel.text = @"subtitleLabelsubtitleLabelsubtitleLabel";
[self addSubview:self.subtitleLabel];//添加按钮
self.button = [UIButton buttonWithType:UIButtonTypeCustom];
self.button.frame = self.bounds;
[self.button addTarget:self action:@selector(respondsToOnBtn) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:self.button];
}- (void)setTitle:(NSString *)title
{self.titleLabel.text = title;
}- (void)setSubtitle:(NSString *)subtitle
{
self.subtitleLabel.text = subtitle;
}- (void)respondsToOnBtn{NSLog(@"11111111111");
}

恩,写到这里代码基本上就算全部完成了。运行工程跑起来,也能看到默认的标注点了,but,气泡却没有自动弹出来,也响应不了按钮的点击事件。why? 然后就开始搜索技术贴,果然,有一些收获,有人说是因为本来气泡就写在了标注的视图上,层级关系不对,所以响应不到按钮,相对应的解决方法:在CustomAnnotationView.m文件中添加

- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event

解释一下这个方法的原理:iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,window对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,称之为hit-test view。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {CGPoint tempoint = [self.calloutView.button convertPoint:point fromView:self];if (CGRectContainsPoint(self.calloutView.button.bounds, tempoint)){view = self.calloutView.button;}
}
return view;
}

这里设置了,按道理说,应该能够响应气泡层的按钮事件了。可是,地图上应该先弹出气泡,才能响应按钮事件。到这里,我又卡住了。然后直接在MAAnnotation代理中查看了相关代理方法。发现了有一个selected 的属性,瞬间欣喜如狂,在这下面加上了这个选中的属性。再次运行Demo.有一种感觉自己很聪明的傲娇。结果,地图上确实能够显示标注了,可是却点不动,而且点击气泡以外的View位置,居然气泡不消失了。what?这又是怎么回事…..

然后,在经历了多次测试后发现,气泡要默认弹出显示在地图上,是需要加载定位这个属性所调用的方法。在初始化加载地图的后面补上这段代码。

self.locationManager = [[AMapLocationManager alloc]init];//获取定位创建个人坐标
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;//定位精确度在10米以内//单次定位
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {if (location) {_pointAnnotaion = [[MAPointAnnotation alloc]init];_pointAnnotaion.title = @"蓝鲸鱼待久大酒店蓝鲸鱼待久大酒店蓝鲸鱼待久大酒店";CLLocationCoordinate2D coordinate = {30.6594620000,104.0657350000};_mapView.centerCoordinate = coordinate;_pointAnnotaion.coordinate = coordinate;_mapView.zoomLevel = 17;[self.mapView addAnnotation:self.pointAnnotaion];//默认选中标注数据对应的view (同时在地图 MAMapViewDelegate方法中,去掉selected这个选中)[self.mapView selectAnnotation:self.pointAnnotaion animated:YES];}
}];

然后就可以完全实现自己想要的效果了。

注:以上均为个人的实现方法和建议,如果有更好的方法,欢迎回复讨论。

关于高德地图标注的那些坑相关推荐

  1. Vue引用原生高德地图标注

    Vue引用原生高德地图标注 一.引用高德? 首先在vue项目中的pubic下的index.html的head中引用. 二.在你的模板中设置一个div你的地图容器 <template>< ...

  2. 点击高德地图标注没法弹窗_巴彦淖尔果农注意啦!林草局喊你上高德地图标注位置哦...

    采摘果园游人少?想去采摘找不到果园?解决办法来了!记者近日从巴彦淖尔市林草局了解到,国家林业和草原局与阿里巴巴集团高德软件有限公司合作,开展"全国采摘果园一张图"工作,利用高德地图 ...

  3. 点击高德地图标注没法弹窗_如何在地图上标注我的店铺

    在电子地图上添加自己店铺位置,不仅为客户到达提供了明确位置并形成了行程路线,同时实体店曝光率也增加了.那么如何在地图上标注我的店铺呢?下面就以高德地图为例,给大家介绍一下如何在地图上标注我的店铺吧. ...

  4. 跟我学在高德地图——标注我的位置

    这里使用的SDK为AMap_Location_V2.5.0_20160526.jar 没有接触过高德地图的同学,请参考 加载一张高德地图 1.获取我的位置 package com.pansoft.oi ...

  5. 【高德地图】易采坑合集

    1. HeatmapLayer 热力图层透明度opacity属性设置无效 热力图层必须是数组 2. 降低[point]自带文字透明度 将叠加图层的zIndex设置到很高即可降亮度 3. vue页面切换 ...

  6. HTML高德地图标注,文本标记-点标记-示例中心-JS API 示例 | 高德地图API

    文本标记 html, body, #container { height: 100%; width: 100%; } var map = new AMap.Map("container&qu ...

  7. 高德地图api实现导航功能(使用经验)避坑关注

    关于导航功能的实现实际上就是使用市面上开放的地图api,按照操作文档进行开发实现功能的. 业内流行的无非是两种,一种高德地图api,另一种是百度地图api,博主这里选用了高德地图api,进行避坑讲解. ...

  8. 时时获得高德地图坐标 http://lbs.amap.com/console/show/picker

    1.高德地图标注 在做开发时,或者做高德地图标注的时候,要用到高德地图的坐标,时时获得高德地图坐标 http://lbs.amap.com/console/show/picker 老的高德地图标注地址 ...

  9. 高德地图开发-常用api踩坑使用

    一.高德地图的加载初始化 在这就踩过很多坑,新建项目正常显示没问题,放到我们的项目就是不显示,加载不出来, 这个时候不要慌,只要确保下面三部完成就莫问题了 1.引入高德地图开发者api <scr ...

  10. 地图定义一个中间不动标注_高德地图吊打百度个性地图更新版,成为最佳分析图利器...

    转自:绿变变 本文已获得授权 说到区位分析图,如何获取地图一直以来是大家都在讨论的问题,不单单要获取地图,还需要那种可以单独调出建筑图层,交通路网图层,绿地图层,以及各项地图中的元素,毕竟我们做前期分 ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之机房密码
  2. 学校开展计算机培训活动,计算机学院学习筑梦班开展义务清扫机房活动
  3. 风险案例-25期-与有过合作经历客户在新合同约定中过于简单、范围不明确,导致客户对新需求工作量不认可...
  4. STM32串口实时接收数据与所提前定义的比较,并作出相应的操作
  5. 实现SQL Server 2012 镜像
  6. 操作系统实验报告16:CPU 调度
  7. python数据类型汇总_python基础数据类型汇总
  8. AngularJS操作DOM——angular.element
  9. 高通cpu排行_安卓手机芯片排行:麒麟990 5G仅排第三,980还输给了765G?
  10. LinkedList源码学习
  11. [外挂1] MFC 鼠标位置设置
  12. OpenStack源码系列---nova-conductor
  13. joomla 1.5 笔记
  14. 3种云桌面(VDI、IDV、VOI)技术解决方案简介
  15. ul1581标准_UL 1581电线电缆燃烧试验
  16. halcon教程之VisionPro软件和Halcon软件 的详细对比
  17. HTTP/3正式发布,深入理解HTTP/3协议
  18. STL之字符串类模板 string(三)、C++ string类成员函数
  19. 原生js的JSONP跨域请求
  20. ICANN近日将更改DNS信任密钥中的密钥对

热门文章

  1. Boob炸弹拆除IDA版
  2. python_习题一
  3. 百度智能手环方案开源(含源码,原理图,APP,通信协议等)
  4. 笃行杂记之Zookeeper SessionTimeOut分析
  5. 哪种程序员最挣钱?平均月薪30.8K,网友说这是掌握世界的技术
  6. python窗口中导入图片_Python3 tkinter基础 Text image 文本框中插入图片
  7. 免费在线绘制CircRNA吸附miRNA圈图
  8. 联通loid认证_光纤LOID 认证 需要填写的用户名是什么?有人说不...
  9. seurat质控Warning: Feature names cannot have underscores (‘_‘), replacing with dashes (‘-‘)
  10. [0CTF 2016]piapiapia 1