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
}