高德地图官方文档:https://lbs.amap.com/api/ios-sdk/guide/draw-on-map/draw-marker

之前那些SDK导入就不做说明了,直接导入后,开始。

看高德地图官方文档基本都是OC语言写的,swift也就没这么详细说明了。

这种高度自定义,用的也是oc自定义,没有给出swift版本的demo出来,所以我们想做到后面这个效果来:

气泡在iOS中又称为callout,它由背景气泡内容构成,如下图所示:

也就是官方的效果。今天我们就用Swift来实现他了:

添加自定义气泡

(1) 新建自定义气泡类 CustomCalloutViewSwift,继承 UIView。

(2)在类中重写UIView的drawRect方法,绘制弹出气泡的背景,可以自己更改背景颜色。 

(3)定义用于显示气泡内容的控件,并添加到SubView中。如上图所示气泡,我们需要一个UIImageView和两个UILabel

(4)在CustomCalloutView.m中给控件传入数据。

import UIKitclass CustomCalloutViewSwift: UIView{var portraitView : UIImageView!var subtitleLabel : UILabel!var titleLabel : UILabel!//初始化定义气泡的背景override func draw(_ rect: CGRect) {drawInContext(context: UIGraphicsGetCurrentContext()!)self.layer.shadowColor = UIColor.red.cgColorself.layer.shadowOpacity = 1.0self.layer.shadowOffset = CGSize.init(width: 0.0, height: 0.0)}override init(frame: CGRect) {super.init(frame: frame)
//        self.backgroundColor = UIColor.redinitSubViews()}required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)initSubViews()fatalError("init(coder:) has not been implemented")}func drawInContext(context : CGContext) {context.setLineWidth(2.0)context.setFillColor(red: 0.3, green: 0.3, blue: 0.3, alpha: 0.8)getDrawPath(context: context)context.fillPath()}func getDrawPath(context : CGContext) {let kArrorHeight = 10let rect = self.boundslet radius = 6.0let minx = rect.minXlet midx = rect.midXlet maxx = rect.maxXlet miny = rect.minYlet maxy = rect.maxY - 10context.move(to: CGPoint.init(x: midx + CGFloat(kArrorHeight), y: maxy))context.addLine(to: CGPoint.init(x: midx, y: maxy + CGFloat(kArrorHeight)))context.addLine(to: CGPoint.init(x: midx - CGFloat(kArrorHeight), y: maxy))context.addArc(tangent1End: CGPoint.init(x: minx, y: maxy), tangent2End: CGPoint.init(x: minx, y: miny), radius: CGFloat(radius))context.addArc(tangent1End: CGPoint.init(x: minx, y: minx), tangent2End: CGPoint.init(x: maxx, y: miny), radius: CGFloat(radius))context.addArc(tangent1End: CGPoint.init(x: maxx, y: miny), tangent2End: CGPoint.init(x: maxx, y: maxx), radius: CGFloat(radius))context.addArc(tangent1End: CGPoint.init(x: maxx, y: maxy), tangent2End: CGPoint.init(x: midx, y: maxy), radius: CGFloat(radius))context.closePath();}//初始化定义气泡的内容func initSubViews() {backgroundColor = UIColor.clearlet kPortraitMargin = 5.0let kPortraitWidth = 70.0let kPortraitHeight = 50.0let kTitleWidth = 120.0let kTitleHeight = 20.0// 添加图片,即商户图portraitView = UIImageView.init(frame: CGRect.init(x: kPortraitMargin, y: kPortraitMargin, width: kPortraitWidth, height: kPortraitHeight))portraitView.backgroundColor = UIColor.blackaddSubview(portraitView)// 添加标题,即商户名titleLabel = UILabel.init(frame: CGRect.init(x: kPortraitMargin * 2 + kPortraitWidth, y: kPortraitMargin, width: kTitleWidth, height: kTitleHeight))titleLabel.font = UIFont.systemFont(ofSize: 14)titleLabel.textColor = UIColor.whitetitleLabel.text = "我是商户名"addSubview(titleLabel)// 添加副标题,即商户地址subtitleLabel = UILabel.init(frame: CGRect.init(x: kPortraitMargin * 2 + kPortraitWidth, y: kPortraitMargin * 2 + kTitleHeight, width: kTitleWidth, height: kTitleHeight))subtitleLabel.font = UIFont.systemFont(ofSize: 12)subtitleLabel.textColor = UIColor.lightGraysubtitleLabel.text = "我是商户地址"addSubview(subtitleLabel)}//给控件传入数据func setTitle(title : NSString) {titleLabel.text = title as String;}func setSubtitle(subtitle : NSString) {subtitleLabel.text = subtitle as String;}func setImage(image : UIImage) {portraitView.image = image;}///导航事件@objc func guidBtnAction() {
//        self.guideActionCallBack?()}func guideActionCallBack() {print("click btn")}
}

以上就是自定义气泡的全部过程,但是为了在点击标注时,弹出自定义的气泡,还需要。步骤如下:

添加自定义AnnotationView

(1) 新建类CustomAnnotationViewSwift,继承MAAnnotationView或MAPinAnnotationView。若继承MAAnnotationView,则需要设置标注图标;若继承MAPinAnnotationView,使用默认的大头针标注

(2) 在CustomAnnotationViewSwift中定义自定义气泡属性,可修改calloutView属性

(3) 重写选中方法setSelected。选中时新建并添加calloutView,传入数据;非选中时删除calloutView。

import UIKitclass CustomAnnotationViewSwift: MAAnnotationView {//定义气泡背景与内容对象var calloutView : CustomCalloutViewSwift?var content : String?//重写选中效果override func setSelected(_ selected: Bool, animated: Bool) {if self.isSelected == selected{return;}if selected {if calloutView == nil {calloutView = CustomCalloutViewSwift.init(frame: CGRect.init(x: 0, y: 0, width: 200, height: 70))calloutView!.center = CGPoint.init(x: bounds.width/2 + calloutOffset.x, y: -calloutView!.bounds.height/2 + calloutOffset.y)}//传入数据给气泡内容let image = UIImage.init(named: "MyImageName")calloutView?.setImage(image: image!)calloutView?.setTitle(title: "我是商家名")calloutView?.setSubtitle(subtitle: "我是商家地址")addSubview(calloutView!)} else {calloutView!.removeFromSuperview()}super.setSelected(selected, animated: animated)}func setContent(content : String){self.content = content}
}

定义了上面两个类,我们直接在地图上调用就好了,

 func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
//MAPointAnnotation,自定义POI点数据,参考demo河马if annotation is MAPointAnnotation {let customReuseIndetifier: String = "customReuseIndetifier"//从复用内存池中获取制定复用标识的annotation view,自定义气泡样式CustomAnnotationView
//            var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: customReuseIndetifier) as? CustomAnnotationViewvar annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: customReuseIndetifier) as? CustomAnnotationViewSwiftif annotationView == nil {annotationView = CustomAnnotationViewSwift.init(annotation: annotation, reuseIdentifier: customReuseIndetifier)//是否允许弹出calloutannotationView?.canShowCallout = false///添加到地图时是否使用下落动画效果//            annotationView!.animatesDrop = false///是否支持拖动annotationView?.isDraggable = true///弹出框默认位于view正中上方,可以设置calloutOffset改变view的位置,正的偏移使view朝右下方移动,负的朝左上方,单位是屏幕坐标annotationView?.calloutOffset = CGPoint.init(x: 0, y: -5)}let wellBlueState = UIImage(named: "restaurant")annotationView?.image = wellBlueState//背景颜色,透明annotationView?.backgroundColor = Theme.transparentannotationView?.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
//            annotationView?.portrait = UIImage.init(named: "login")
//            annotationView?.name = "河马"return annotationView}return nil}

自定义调用:var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: customReuseIndetifier) as? CustomAnnotationViewSwift

运行程序,效果如下:

IOS - Swift高德地图自定义标注、气泡相关推荐

  1. Swift之高德地图自定义标注弹出气泡样式

    在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...

  2. Swift 高德地图自定义大头针自定义气泡

    自定义大头针和自定义气泡的代码官方文档上都写的很详细,我这里不再记录,这篇主要记录的是自定义气泡上面有一个按钮,点击按钮响应对应事件的场景,效果如下: 上面的车是自定义的大头针,点击大头针弹出自定义气 ...

  3. Android高德地图自定义Markers的例子

    下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...

  4. vue框架中使用高德地图自定义icon问题

    ** vue框架中使用高德地图自定义icon问题 ** vue框架中使用高德地图自定义icon,在编译时,因为图片会有封装问题等,但是在高德地图中没有转化对应的路径,在最后结果中会出现找不到图标的问题 ...

  5. 高德地图的标志放大_高德地图点标注的分布与缩放

    本文介绍了在 React Native 平板开发中使用高德地图组件的一个案例,重点介绍了如何计算并缩放到所需状态,以及地图 Webview 与 React Native 通信的方式. 欢迎关注我的专栏 ...

  6. Android 高德地图自定义线路规划选择方案之后按照方案进行导航

    Android 高德地图自定义线路规划选择方案之后按照方案进行导航 因为我这边导航需求的问题,导致我这边不能使用高德地图官方的线路规划和导航.所以我这边线路规划和导航界面都是根据高德地图那边给的api ...

  7. iOS—— 调用高德地图SDK

    iOS-- 调用高德地图SDK 我们在许多App中可以发现关于地图的调用以及定位等等功能都是什么重要的,比如滴滴打车,美团外卖等等都是十分依赖于地图的.所以我们就应该学会如和去调用地图.本周我就学习了 ...

  8. 百度地图自定义标注点

    百度地图自定义标注点 //创建点 var point = new BMap.Point(109.49926175379778, 36.60449676862417); //创建自定义标 //参数1:自 ...

  9. 高德地图自定义图标的点标记Marker--初体验(二)

    点标记Marker 创建一个默认图标的点标记: 创建一个自定义图标的点标记: new AMap.Marker({}) 参数说明 本文以Marker为主,其他点标记方法大差不差 通过上两篇文章我们已经了 ...

  10. vue3实现高德地图多点标注(so easy)

    vue3实现高德地图多点标注(so easy) 前言 思路清晰,抽丝剥茧 必要的准备工作 最简单的部分 处理数据之前(最关键的思路) 效果 完整代码 前言 非常感谢你能打开这篇博客,我想你一定是遇到了 ...

最新文章

  1. Chemistry.AI | 基于线性回归预测分子特性
  2. mysql 触发器 实例_mysql的触发器-含案例-含效果 | 时刻需
  3. 主机访问虚拟机中linux上的web服务
  4. 做事情一定要从小事情着手
  5. CIFAR-10数据集可视化二进制版本
  6. 中国电子计算机大学竞赛安徽分赛,我院学子喜获第十二届全国大学生数学竞赛安徽赛区15项一等奖...
  7. Java面试题(亲身经历)
  8. 盘点开发者最爱的 IntelliJ 插件 Top 10
  9. python的安装和运行
  10. 彩虹云商城 最新彩虹代刷V6.9.0免授权纯净完整版
  11. 2019中兴捧月·初赛心得
  12. 提高系统可靠性的措施
  13. hdu 4966 GGS-DDU 最小树形图
  14. 调用泛微OA接口的一些基本常识
  15. Cookies的封装
  16. 双向可控硅过零触发电路
  17. SAP 基于收货的发票校验 GR-Based IV
  18. 使用es的新姿势 2.x 5.x 6.x通用
  19. 关系型数据库尚能饭否?NoSQL、NewSQL谁能接棒?
  20. AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」

热门文章

  1. Win10 解决电脑插入耳机没声音。
  2. PR软件有哪些辅助功能?Premiere Pro 的辅助功能介绍
  3. iphone手机投射到电脑的过程详解
  4. word设置页眉页码 首页没有页眉(终于搞懂了)
  5. vue2.0 仿蘑菇街
  6. git查看状态和修改信息
  7. BZOJ 1951 古代猪文 鲁卡斯定理+费马小定理+中国剩余定理
  8. 为什么计算机连不上无线网络,笔记本无线连不上是什么原因_为什么笔记本电脑连不上wifi-win7之家...
  9. 编程题——真题训练一(WYYX)
  10. python如何提交作业_提交作业