2018-03-09

swift 高德地图 自定义弹出气泡


1、CalloutView

import UIKit

class CustomCalloutView: UIView {

    let kArrorHeight:CGFloat = 10.0

    override init(frame: CGRect) {

        super.init(frame: frame)

        self.backgroundColor = .clear

    }


    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }


    override func draw(_ rect: CGRect) {

        guard let context = UIGraphicsGetCurrentContext() else { return }

        drawInContext(context: context)

    }



    func drawInContext(context:CGContext){

        context.setLineWidth(2.0)

        context.setFillColor(RGB(71, g: 74, b: 87).cgColor)

        setDrawPath(context: context)

        context.fillPath()

    }


    func setDrawPath(context:CGContext){

        let rrect = self.bounds

        let radius:CGFloat = (self.bounds.height - kArrorHeight)/2.0

        let minx = rrect.minX,

        midx = rrect.midX,

        maxx = rrect.maxX

        let miny = rrect.minY,

        maxy = rrect.maxY - kArrorHeight

        context.move(to: CGPoint.init(x: midx + kArrorHeight, y: maxy))

        context.addLine(to: CGPoint.init(x: midx, y: maxy + kArrorHeight))

        context.addLine(to: CGPoint.init(x: midx - kArrorHeight, y: maxy))

        context.addArc(tangent1End: CGPoint.init(x: minx, y: maxy), tangent2End: CGPoint.init(x: minx, y: miny), radius: radius)

        context.addArc(tangent1End: CGPoint.init(x: minx, y: minx), tangent2End: CGPoint.init(x: maxx, y: miny), radius: radius)

        context.addArc(tangent1End: CGPoint.init(x: maxx, y: miny), tangent2End: CGPoint.init(x: maxx, y: maxx), radius: radius)

        context.addArc(tangent1End: CGPoint.init(x: maxx, y: maxy), tangent2End: CGPoint.init(x: midx, y: maxy), radius: radius)

        context.closePath()

    }

}



2、AnnotationView

import UIKit

class CustomAnnotationView: MAAnnotationView {

    var nameLabel:UILabel!

    var callOutView:CustomCalloutView!


    var kCalloutWidth:CGFloat = 300.0

    let kCalloutHeight:CGFloat = 47.0



    override func setSelected(_ selected: Bool, animated: Bool) {

        if self.isSelected == selected {

            return

        }

        if selected{

            if callOutView == nil{

                callOutView = CustomCalloutView.init(frame: CGRect.init(x: 0, y: 0, w: kCalloutWidth, h: kCalloutHeight))

                nameLabel = UILabel.init(frame: CGRect.init(x: 0, y: 0, w: kCalloutWidth, h: kCalloutHeight - 10))

                nameLabel.textColor = .white

                nameLabel.font = UIFont.systemFont(ofSize: 16)

                nameLabel.text = "高新区软件园"

                nameLabel.textAlignment = .center

                callOutView.addSubview(nameLabel)

            }

            self.addSubview(callOutView)

        }else{

            callOutView.removeFromSuperview()

        }

        super.setSelected(selected, animated: animated)

    }


    func setName(name:String){

        let attributes = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)]

        let option = NSStringDrawingOptions.usesLineFragmentOrigin

        let rect = name.boundingRect(with: CGSize.init(width: kCalloutWidth, height: kCalloutHeight), options: option, attributes: attributes, context: nil)

        var  width = rect.size.width + 24

        if width < 100 {

            width = 100

        }

        nameLabel.text = name

        nameLabel.frame = CGRect.init(x: 0, y: 0, w: width, h: kCalloutHeight - 10)

        callOutView.frame = CGRect.init(x: 0, y: 0, w: width, h: kCalloutHeight)

        callOutView.center = CGPoint.init(x: self.bounds.width/2.0 + self.calloutOffset.x, y: self.calloutOffset.y - 30)

    }

}




3、使用

A.画轨迹

      var lineCoordinates = Array()

        for item in List {

            let cor = AMapCoordinateConvert(CLLocationCoordinate2D(latitude: item.latitude!, longitude: item.longitude!), AMapCoordinateType.GPS)

            lineCoordinates.append(cor)

        }

        let polyline: MAPolyline = MAPolyline(coordinates: &lineCoordinates, count: UInt(lineCoordinates.count))

        mapView.add(polyline)

        mapView.setVisibleMapRect(polyline.boundingMapRect, animated: true)


B.画点

let lati = ..

let long = ..

let startCor = AMapCoordinateConvert(CLLocationCoordinate2D(latitude: lati, longitude: long), AMapCoordinateType.GPS)

  var  startPoint.coordinate = startCor

        startPoint.title = nil

        startPoint.subtitle = nil

        mapView.addAnnotation(startPoint)



    //MARK: 地图回调

    func mapView(_ mapView: MAMapView!, didSelect view: MAAnnotationView!) {

        guard let actionView:CustomAnnotationView  = view as? CustomAnnotationView else{

            return

        }

        if actionView.tag == 1 {

            actionView.setName(name: "起点")

        }else{

            actionView.setName(name:"终点")

        }

    }

    func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {


        if annotation.isKind(of: MAPointAnnotation.self) {

            let pointReuseIndetifier = "CustomReuseIndetifier"

            var annotationView: MAAnnotationView? = mapView.dequeueReusableAnnotationView(withIdentifier: pointReuseIndetifier)


            if annotationView == nil {

                annotationView = CustomAnnotationView(annotation: annotation, reuseIdentifier: pointReuseIndetifier)

            }

          if annotation.isEqual(startPoint){

                annotationView!.image = #imageLiteral(resourceName: "startpin")

                annotationView?.tag = 1

            }else{

                annotationView!.image = #imageLiteral(resourceName: "endpin")

                annotationView?.tag = 2

            }

            annotationView!.centerOffset = CGPoint.init(x: 0, y: -12)

            //设置中心点偏移,使得标注底部中间点成为经纬度对应点

            annotationView!.canShowCallout = false

//            annotationView!.animatesDrop = true

//            annotationView!.isDraggable = true

            return annotationView!

        }

        return nil

    }


func mapView(_ mapView: MAMapView!, rendererFor overlay: MAOverlay!) -> MAOverlayRenderer! {

        if overlay.isKind(of: MAPolyline.self) {

            let renderer: MAPolylineRenderer = MAPolylineRenderer(overlay: overlay)

            renderer.lineWidth = 8.0

            renderer.strokeColor = RGB(73, g: 152, b: 239)

            return renderer

        }

        return nil

    }



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • Android Studio学习笔记 1、Toast的使用 toast 就是在界面上显示一个提示画面 它可以直接显...
    安多人阅读 175评论 0 0
  • 从零建校(十):绝了,未开业即爆满!开业前的市场招生活动重要提醒 2018-02-13 任学堂 正文共:3839字...
    任学堂阅读 452评论 0 2
  • 01 今天看了一期《爱情保卫战》,一对结婚六年的夫妻因为要不要生孩子来寻求帮助。 原以为女方是想先开创事业再考虑生...
    到处乱撞的鱼阅读 338评论 0 1
  • 俗话说,爱美之心,人皆有之。谁不希望自己天生有一副姣好的面容?出色的容貌就像一张丰富的履历,让人印象深刻。在这个看...
    向行阅读 262评论 4 6
  • 貌似从学生时代开始,学习就成了最重要的东西,真实地在为他人价值观而活,渐渐成为一个表现型,太过关注他人的看法,而没...
    流云戏水阅读 197评论 0 1