高德地图自定义annotation图标
来源:互联网 发布:位图软件有哪些 编辑:程序博客网 时间:2024/05/22 04:49
在写lbs相关的app时,肯定会在地图上标记一些坐标点,有时候也需要根据需求来改变标记的外观,这篇文章就是记录了我使用高德地图sdk的添加自定义样式点标记时遇到的问题以及解决方法。我使用的开发语言是swift。
我的需求是要在一个地图页面上动态标记从网络获取的点,并且动态生成点标记的样式。简单的说就是在地图上戳的点的图标是我从网络动态获取的图标。
我看了高德开放平台的教程,无论是添加自定义样式点标记还是添加自定义AnnotationView都没有办法满足我的需求,因为这两种办法都需要提前导入图片,也就是提前把图片放入Assets文件夹里。
高德开放平台的教程:
添加自定义样式点标记
添加自定义AnnotationView
于是乎我是这样解决的:
先定义几个全局数组用于存放我所需要的从网络获取的点标记外观样式等信息,你也可以使用字典等其他数据类型,为了方便我使用普通一维数组。然后我发现:每次调用标注代理方法的时候,这些全局数组的最后一个元素就是我所需要的数据!!不信你可以在代理方法里打印一下 。友情提示:数组的最后一个元素的获取方法是 .last。
代码大概如下:
import UIKitimport Alamofireimport SwiftyJSONimport SVProgressHUDclass AnnotationViewController: UIViewController,UINavigationControllerDelegate{ /// 高德地图view var mapView = MAMapView() /// 主storyboard let storyBoard = UIStoryboard(name: "Main", bundle: nil) /// 点标记坐标数组 var annotationLocations = [CLLocation]() /// 点标记名称数组 var annotationNames = [String]() /// 点标记图标url var logoURLs = [NSURL]() /// 点标记图标 var logos = [UIImage]() override func viewDidLoad() { super.viewDidLoad() /// 初始化地图view,这个方法的代码实现在这篇文章里已省略!需自行添加。 initMapView() /// 初始化点标记view initAnnotationView() } // MARK: - 初始化点标记view func initAnnotationView(){ /// 一定要记得这一步,否则无法正常生效 mapView.delegate = self /// 进行网络请求,这里以json为例 Alamofire.request(.GET, requestURL, parameters: parameters) .responseJSON{ response in /// 解析数据 var responseData = JSON(data: response.data!) var datas = responseData["data"] /// 遍历数据 for i in 0..<(datas.count){ /// 获取图标url并将图标url追加到logoURLs数组 let logoURLString = datas[i]["logoUrl"].stringValue let logoURL = NSURL(string: logoURLString) self.logoURLs.append(logoURL!) /// 获取图标并将图标追加到logos数组 let logoData = NSData(contentsOf: logoURL as! URL) let logo = UIImage(data: logoData as! Data) self.logos.append(logo!) /// 戳点 let annotationPoint = MAPointAnnotation() /// 添加点标记的坐标和标题 annotationPoint.coordinate = self.annotationLocations[i].coordinate annotationPoint.title = self.annotationNames[i] self.mapView.addAnnotation(annotationPoint) } } } }// MARK: - MAMapViewDelegate代理方法extension BWExpressViewController: MAMapViewDelegate{ // MARK: - 标注代理方法 func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! { if annotation.isKind(of: MAPointAnnotation.self){ let annotationIdentifier = "locationIentifier" var poiAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as? MAPinAnnotationView if poiAnnotationView == nil{ poiAnnotationView = MAPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) } /// logos最后一个元素就是每次戳点所对应的图标 poiAnnotationView!.image = logos.last poiAnnotationView!.animatesDrop = false poiAnnotationView!.canShowCallout = true return poiAnnotationView } return nil } }
后来仔细想想也是,每次调用代理方法的时候,就会往数组追加一下然后马上戳点,那么数组最新一个元素理所当然是该点的属性啦~
原文博客地址
0 0
- 高德地图自定义annotation图标
- 高德地图-添加自定义图标
- 高德地图开发-- 自定义图标
- 高德地图(百度地图,Google地图)中自定义Annotation&CallOutView
- android高德地图自定义定位图标并具有类似陀螺仪旋转功能。
- 高德地图之改变图标
- Android高德地图自定义地图指南针
- 高德地图自定义路网
- 【swift】高德地图 Annotation 的小坑
- 高德地图自定义POI的样式
- 高德地图自定义Marker显示文字
- 高德地图 AndroidSDK 自定义Marker
- 高德、百度地图自定义底图
- 高德地图---自定义飘窗
- 高德地图自定义infowindow窗口
- 高德地图BusLineOverlay自定义公交线路
- 自定义高德地图导航界面
- 高德地图自定义Marker显示文字
- JSP2的自定义标签(2)
- UE4正则表达式检测输入信息
- 《品味大数据》获得好评,兼论我的2017愿景
- 条形码--JsBarcode
- 文本元素
- 高德地图自定义annotation图标
- poj2524并查集模板
- 学习各种元素标记
- 迟到的2016年年终总结----拒绝平庸的一年
- Python 命令
- Android事件分发机制(上)View部分
- 菜鸟理财——基础理财概念
- 运算符重载
- 蓝桥寒假训练1->2013年第四届蓝桥杯省赛