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

    }



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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