美文网首页
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