IOS - Swift高德地图自定义标注、气泡
高德地图官方文档: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高德地图自定义标注、气泡相关推荐
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
- Swift 高德地图自定义大头针自定义气泡
自定义大头针和自定义气泡的代码官方文档上都写的很详细,我这里不再记录,这篇主要记录的是自定义气泡上面有一个按钮,点击按钮响应对应事件的场景,效果如下: 上面的车是自定义的大头针,点击大头针弹出自定义气 ...
- Android高德地图自定义Markers的例子
下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...
- vue框架中使用高德地图自定义icon问题
** vue框架中使用高德地图自定义icon问题 ** vue框架中使用高德地图自定义icon,在编译时,因为图片会有封装问题等,但是在高德地图中没有转化对应的路径,在最后结果中会出现找不到图标的问题 ...
- 高德地图的标志放大_高德地图点标注的分布与缩放
本文介绍了在 React Native 平板开发中使用高德地图组件的一个案例,重点介绍了如何计算并缩放到所需状态,以及地图 Webview 与 React Native 通信的方式. 欢迎关注我的专栏 ...
- Android 高德地图自定义线路规划选择方案之后按照方案进行导航
Android 高德地图自定义线路规划选择方案之后按照方案进行导航 因为我这边导航需求的问题,导致我这边不能使用高德地图官方的线路规划和导航.所以我这边线路规划和导航界面都是根据高德地图那边给的api ...
- iOS—— 调用高德地图SDK
iOS-- 调用高德地图SDK 我们在许多App中可以发现关于地图的调用以及定位等等功能都是什么重要的,比如滴滴打车,美团外卖等等都是十分依赖于地图的.所以我们就应该学会如和去调用地图.本周我就学习了 ...
- 百度地图自定义标注点
百度地图自定义标注点 //创建点 var point = new BMap.Point(109.49926175379778, 36.60449676862417); //创建自定义标 //参数1:自 ...
- 高德地图自定义图标的点标记Marker--初体验(二)
点标记Marker 创建一个默认图标的点标记: 创建一个自定义图标的点标记: new AMap.Marker({}) 参数说明 本文以Marker为主,其他点标记方法大差不差 通过上两篇文章我们已经了 ...
- vue3实现高德地图多点标注(so easy)
vue3实现高德地图多点标注(so easy) 前言 思路清晰,抽丝剥茧 必要的准备工作 最简单的部分 处理数据之前(最关键的思路) 效果 完整代码 前言 非常感谢你能打开这篇博客,我想你一定是遇到了 ...
最新文章
- Chemistry.AI | 基于线性回归预测分子特性
- mysql 触发器 实例_mysql的触发器-含案例-含效果 | 时刻需
- 主机访问虚拟机中linux上的web服务
- 做事情一定要从小事情着手
- CIFAR-10数据集可视化二进制版本
- 中国电子计算机大学竞赛安徽分赛,我院学子喜获第十二届全国大学生数学竞赛安徽赛区15项一等奖...
- Java面试题(亲身经历)
- 盘点开发者最爱的 IntelliJ 插件 Top 10
- python的安装和运行
- 彩虹云商城 最新彩虹代刷V6.9.0免授权纯净完整版
- 2019中兴捧月·初赛心得
- 提高系统可靠性的措施
- hdu 4966 GGS-DDU 最小树形图
- 调用泛微OA接口的一些基本常识
- Cookies的封装
- 双向可控硅过零触发电路
- SAP 基于收货的发票校验 GR-Based IV
- 使用es的新姿势 2.x 5.x 6.x通用
- 关系型数据库尚能饭否?NoSQL、NewSQL谁能接棒?
- AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」
热门文章
- Win10 解决电脑插入耳机没声音。
- PR软件有哪些辅助功能?Premiere Pro 的辅助功能介绍
- iphone手机投射到电脑的过程详解
- word设置页眉页码 首页没有页眉(终于搞懂了)
- vue2.0 仿蘑菇街
- git查看状态和修改信息
- BZOJ 1951 古代猪文 鲁卡斯定理+费马小定理+中国剩余定理
- 为什么计算机连不上无线网络,笔记本无线连不上是什么原因_为什么笔记本电脑连不上wifi-win7之家...
- 编程题——真题训练一(WYYX)
- python如何提交作业_提交作业