高德地图自定义annotation图标

来源:互联网 发布:位图软件有哪些 编辑:程序博客网 时间:2024/05/22 04:49

在写lbs相关的app时,肯定会在地图上标记一些坐标点,有时候也需要根据需求来改变标记的外观,这篇文章就是记录了我使用高德地图sdk的添加自定义样式点标记时遇到的问题以及解决方法。我使用的开发语言是swift。

我的需求是要在一个地图页面上动态标记从网络获取的点,并且动态生成点标记的样式。简单的说就是在地图上戳的点的图标是我从网络动态获取的图标
img
我看了高德开放平台的教程,无论是添加自定义样式点标记还是添加自定义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
原创粉丝点击