美文网首页
2018-03-09

2018-03-09

作者: yizilenfen | 来源:发表于2018-03-09 09:48 被阅读0次

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

    }


相关文章

网友评论

      本文标题:2018-03-09

      本文链接:https://www.haomeiwen.com/subject/elqpfftx.html