| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694 |
- //
- // MapAmapThemeControl.swift
- // map_amap_ios
- //
- // Created by 诺诺诺的言 on 2025/7/22.
- //
- import Foundation
- import MapKit
- import Combine
- import AMapFoundationKit
- import MAMapKit
- @available(iOS 13.0, *)
- class MapAmapThemeControl: UIViewController {
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- let viewModel: MapAmapViewAndDataExchange
- var autonaviMap : MAMapView!
-
-
- //let mapView = MKMapView()
- private var cancellables = Set<AnyCancellable>()
-
- init(viewModel: MapAmapViewAndDataExchange) {
- self.viewModel = viewModel
- super.init(nibName: nil, bundle: nil)
- //mapView.showsUserLocation = false
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- // 1. 设置隐私(必须!)
- MAMapView.updatePrivacyShow(.didShow, privacyInfo: .didContain)
- MAMapView.updatePrivacyAgree(.didAgree)
-
- AMapServices.shared().enableHTTPS = true
- loadMainMapView()
- bindViewModel()
- }
- private func loadMainMapView() {
- guard AMapServices.shared().apiKey != nil else {
- fatalError("高德地图API Key未配置!")
- }
-
- autonaviMap = MAMapView(frame: view.bounds)
- print("地图初始化失败,请检查Key和Bundle ID--\(autonaviMap)")
- guard let map = autonaviMap else {
- print("地图初始化失败,请检查Key和Bundle ID--")
- return
- }
-
- map.delegate = self
- map.logoCenter = CGPointMake(-100, 0)
- map.isRotateCameraEnabled = false
- map.showsCompass = false
- map.isRotateEnabled = false
- map.mapType = .standard
- map.showsUserLocation = false
- map.userTrackingMode = .none
- view.addSubview(map)
- map.translatesAutoresizingMaskIntoConstraints = false
- view.addSubview(map)
- NSLayoutConstraint.activate([
- map.topAnchor.constraint(equalTo: view.topAnchor),
- map.bottomAnchor.constraint(equalTo: view.bottomAnchor),
- map.leadingAnchor.constraint(equalTo: view.leadingAnchor),
- map.trailingAnchor.constraint(equalTo: view.trailingAnchor)
- ])
- }
-
- private func bindViewModel() {
- viewModel.$markers
- .receive(on: DispatchQueue.main)
- .sink { [weak self] markers in
- if let annotationsList = self?.autonaviMap.annotations {
- print("annotationsListsdfsdfs---\(annotationsList)");
- self?.autonaviMap.removeAnnotations(self?.autonaviMap.annotations)
- }
- // UIView.animate(withDuration: 0.3) {
- // self?.autonaviMap.addAnnotations(markers)
- // }
- var mapMarkerList = [MAPointAnnotation]();
- for markerItem in markers {
- print("markerItemsfsfdsytp---\(markerItem.markerType)---\(String(describing: markerItem.markerName))---\(String(describing: markerItem.tags))")
- let annotationItem : MyMAPointAnnotation = MyMAPointAnnotation(itemMarker: markerItem)
- annotationItem.title = markerItem.markerName;
- annotationItem.coordinate = markerItem.coordinate;
- mapMarkerList.append(annotationItem)
- }
- self?.autonaviMap.addAnnotations(mapMarkerList)
- // self?.autonaviMap.selectAnnotation(mapMarkerList.first, animated: true)
- //self?.autonaviMap.setZoomLevel(20, animated: true)
- /*if !mapMarkerList.isEmpty {
- let selectIemt : MAPointAnnotation = mapMarkerList.first!
- self?.autonaviMap.setCenter(selectIemt.coordinate, animated: true)
- }*/
- }
- .store(in: &cancellables)
-
- ///移动到特定的位置
- viewModel.$currentRegion
- .compactMap { $0 }
- .receive(on: DispatchQueue.main)
- .sink { [weak self] region in
- self?.autonaviMap.setRegion(region, animated: true)
- //self?.mapView.setRegion(region, animated: true)
- }
- .store(in: &cancellables)
-
- viewModel.$polylines
- .receive(on: DispatchQueue.main)
- .sink { [weak self] polylines in
- self!.autonaviMap.removeOverlays(self!.autonaviMap.overlays)
- guard let self, !polylines.isEmpty else { return }
- // 清除旧覆盖物
- self.autonaviMap.removeOverlays(self.autonaviMap.overlays)
- var polyinesList = [MAPolyline]();
- for polyline in polylines {
- let polylineItem : MyMAPolyline = MyMAPolyline(coordinates: &polyline.points, count: UInt(polyline.points.count))
- print("polylinesfsfs---\(polyline.lineType)")
- polylineItem.itemPolyLine = polyline
- polyinesList.append(polylineItem)
- }
-
- // 添加新覆盖物
- self.autonaviMap.addOverlays(polyinesList)
-
- // 自动调整视野
- if let lastPolyline = polylines.last,
- let padding = lastPolyline.mapPadding {
- self.autonaviMap.showOverlays(
- polyinesList,
- edgePadding: UIEdgeInsets(
- top: padding.top,
- left: padding.left,
- bottom: padding.bottom,
- right: padding.right
- ),
- animated: true
- )
- }
- }
- .store(in: &cancellables)
-
- //移动至多个点的位置,并提供设置padding距离
- viewModel.$suitableLocation
- .receive(on: DispatchQueue.main)
- .sink{ [weak self] polylines in
- if let padding = polylines.last?.mapPadding {
- if let atMapPoint : [CLLocationCoordinate2D] = polylines.last?.points {
- self?.autonaviMap.moveToSuitableLocation(points: atMapPoint, padding: padding)
- //self?.mapView.moveToSuitableLocation(points: atMapPoint, padding: padding)
- }
- }
- }
- .store(in: &cancellables)
-
- /*viewModel.$polylines
- .receive(on: DispatchQueue.main)
- .sink { [weak self] polylines in
- guard let self else { return }
-
- // 清除旧覆盖物
- self.autonaviMap.removeOverlays(self.autonaviMap.overlays)
-
- // 空数据检查
- guard !polylines.isEmpty else {
- print("轨迹数据为空")
- return
- }
-
- // 处理每条轨迹
- var validPolylines: [MAPolyline] = []
-
- for polyline in polylines {
- // 坐标数量检查
- guard !polyline.points.isEmpty else {
- print("发现空坐标的轨迹: \(polyline.id)")
- continue
- }
-
- // 指针转换
- let creationResult = polyline.points.withUnsafeBufferPointer { bufferPointer -> MAPolyline? in
- guard let baseAddress = bufferPointer.baseAddress, bufferPointer.count > 0 else {
- return nil
- }
-
- let unsafePointer = UnsafeMutablePointer(mutating: baseAddress)
- return MAPolyline(
- coordinates: unsafePointer,
- count: UInt(bufferPointer.count)
- )
- }
-
- // 结果检查
- guard let mapPolyline = creationResult else {
- print("轨迹创建失败: \(polyline.id)")
- continue
- }
-
- // 绑定属性
- mapPolyline.associatedData = [
- "id": polyline.id,
- "color": polyline.color,
- "width": polyline.width
- ]
-
- validPolylines.append(mapPolyline)
- }
-
- // 添加有效轨迹
- guard !validPolylines.isEmpty else {
- print("没有有效的轨迹数据")
- return
- }
-
- self.autonaviMap.addOverlays(validPolylines)
-
- // 调整视野
- if let lastValid = validPolylines.last,
- let padding = polylines.last?.mapPadding {
- self.autonaviMap.showOverlays(
- validPolylines,
- edgePadding: UIEdgeInsets(
- top: padding.top,
- left: padding.left,
- bottom: padding.bottom,
- right: padding.right
- ),
- animated: true
- )
- }
- }
- .store(in: &cancellables)
-
- viewModel.$markers
- .receive(on: DispatchQueue.main)
- .sink { [weak self] markers in
- self?.mapView.removeAnnotations(self?.mapView.annotations ?? [])
- UIView.animate(withDuration: 0.3) {
- self?.mapView.addAnnotations(markers)
- }
- }
- .store(in: &cancellables)
- viewModel.$polylines
- .receive(on: DispatchQueue.main)
- .sink { [weak self] polylines in
- self?.mapView.removeOverlays(self?.mapView.overlays ?? [])
- var polyinesList = [MKPolyline]();
- for polyline in polylines {
- let polylineItem : MKPolyline = polyline.polyline
- polylineItem.associatedLineId = polyline.id
- polylineItem.associatedLineType = polyline.lineType
- polylineItem.associatedColor = polyline.color
- polylineItem.associatedWidth = polyline.width
- polyinesList.append(polylineItem)
- }
- self?.mapView.addOverlays(polyinesList)
- //self?.mapView.addOverlays(polylines.map({ $0.polyline }))
- if let padding = polylines.last?.mapPadding {
- self?.mapView.fitsAllPoints(
- points: polylines.last?.points.compactMap({ MKMapPoint($0) }) ?? [],
- padding: padding.padding,
- animated: true
- )
- }
- }
- .store(in: &cancellables)
-
- //移动至多个点的位置,并提供设置padding距离
- viewModel.$suitableLocation
- .receive(on: DispatchQueue.main)
- .sink{ [weak self] polylines in
- if let padding = polylines.last?.mapPadding {
- if let atMapPoint : [CLLocationCoordinate2D] = polylines.last?.points {
- self?.mapView.moveToSuitableLocation(points: atMapPoint, padding: padding)
- }
- }
- }
- .store(in: &cancellables)*/
- }
-
- /*var polyinesList = [MKPolyline]();
- for polyline in polylines {
- let polylineItem : MKPolyline = polyline.polyline
- polylineItem.associatedLineId = polyline.id
- polylineItem.associatedLineType = polyline.lineType
- polylineItem.associatedColor = polyline.color
- polylineItem.associatedWidth = polyline.width
- polyinesList.append(polylineItem)
- }
- self?.mapView.addOverlays(polyinesList)
- //self?.mapView.addOverlays(polylines.map({ $0.polyline }))
- if let padding = polylines.last?.mapPadding {
- self?.mapView.fitsAllPoints(
- points: polylines.last?.points.compactMap({ MKMapPoint($0) }) ?? [],
- padding: padding.padding,
- animated: true
- )
- }
-
-
- guard let self, !polylines.isEmpty else { return }
-
- // 清除旧覆盖物
- self.autonaviMap.removeOverlays(self.autonaviMap.overlays)
-
- // 创建自定义Polyline类数组
- let customPolylines = polylines.compactMap { polyline -> CustomPolyline? in
- // 创建高德地图Polyline
- let count = UInt(polyline.points.count)
-
- guard let mapPolyline = MAPolyline(coordinates: &polyline.points , count: count) else {
- return nil
- }
- // 使用自定义类包装
- return CustomPolyline(
- polyline: mapPolyline,
- id: polyline.id,
- color: polyline.color,
- width: polyline.width
- )
- }
-
- // 添加新覆盖物
- self.autonaviMap.addOverlays(customPolylines.map { $0.polyline })
-
- // 自动调整视野
- if let lastPolyline = polylines.last,
- let padding = lastPolyline.mapPadding {
- self.autonaviMap.showOverlays(
- customPolylines.map { $0.polyline },
- edgePadding: UIEdgeInsets(
- top: padding.top,
- left: padding.left,
- bottom: padding.bottom,
- right: padding.right
- ),
- animated: true
- )
- }*/
-
- /*private func bindViewModel() {
- viewModel.$markers
- .receive(on: DispatchQueue.main)
- .sink { [weak self] markers in
- self?.autonaviMap.removeAnnotations(self?.autonaviMap.annotations)
- var mapMarkerList = [MAPointAnnotation]();
- for markerItem in markers {
- let annotationItem : MAPointAnnotation = MAPointAnnotation()
- annotationItem.title = markerItem.markerName;
- annotationItem.coordinate = markerItem.coordinate;
- mapMarkerList.append(annotationItem)
- }
- self?.autonaviMap.addAnnotations(mapMarkerList)
- self?.autonaviMap.selectAnnotation(mapMarkerList.first, animated: true)
- self?.autonaviMap.setZoomLevel(15.1, animated: true)
- let selectIemt : MAPointAnnotation = mapMarkerList.first!
- self?.autonaviMap.setCenter(selectIemt.coordinate, animated: true)
-
- //self?.mapView.removeAnnotations(self?.mapView.annotations ?? [])
- // UIView.animate(withDuration: 0.3) {
- // self?.mapView.addAnnotations(markers)
- // }
- }
- .store(in: &cancellables)
-
- viewModel.$currentRegion
- .compactMap { $0 }
- .receive(on: DispatchQueue.main)
- .sink { [weak self] region in
- self?.mapView.setRegion(region, animated: true)
- }
- .store(in: &cancellables)
- viewModel.$markers
- .receive(on: DispatchQueue.main)
- .sink { [weak self] markers in
- self?.mapView.removeAnnotations(self?.mapView.annotations ?? [])
- UIView.animate(withDuration: 0.3) {
- self?.mapView.addAnnotations(markers)
- }
- }
- .store(in: &cancellables)
- viewModel.$polylines
- .receive(on: DispatchQueue.main)
- .sink { [weak self] polylines in
- self?.mapView.removeOverlays(self?.mapView.overlays ?? [])
- var polyinesList = [MKPolyline]();
- for polyline in polylines {
- let polylineItem : MKPolyline = polyline.polyline
- polylineItem.associatedLineId = polyline.id
- polylineItem.associatedLineType = polyline.lineType
- polylineItem.associatedColor = polyline.color
- polylineItem.associatedWidth = polyline.width
- polyinesList.append(polylineItem)
- }
- self?.mapView.addOverlays(polyinesList)
- //self?.mapView.addOverlays(polylines.map({ $0.polyline }))
- if let padding = polylines.last?.mapPadding {
- self?.mapView.fitsAllPoints(
- points: polylines.last?.points.compactMap({ MKMapPoint($0) }) ?? [],
- padding: padding.padding,
- animated: true
- )
- }
- }
- .store(in: &cancellables)
-
- //移动至多个点的位置,并提供设置padding距离
- viewModel.$suitableLocation
- .receive(on: DispatchQueue.main)
- .sink{ [weak self] polylines in
- if let padding = polylines.last?.mapPadding {
- if let atMapPoint : [CLLocationCoordinate2D] = polylines.last?.points {
- self?.mapView.moveToSuitableLocation(points: atMapPoint, padding: padding)
- }
- }
- }
- .store(in: &cancellables)
- }*/
- }
- // 自定义Polyline包装类
- private class CustomPolyline {
- let polyline: MAPolyline
- let id: String
- let color: String
- let width: Double
-
- init(polyline: MAPolyline, id: String, color: String, width: Double) {
- self.polyline = polyline
- self.id = id
- self.color = color
- self.width = width
- }
- }
- private class MyMAPointAnnotation : MAPointAnnotation {
- let itemMarker : ATMapMarker
- init(itemMarker: ATMapMarker) {
- self.itemMarker = itemMarker
- }
- }
- private class MyMAPolyline : MAPolyline {
- var itemPolyLine : ATMapPolyline! = nil
-
- }
- @available(iOS 13.0, *)
- extension MapAmapThemeControl : MAMapViewDelegate {
- //根据anntation生成对应的View。
- func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
- // guard let marker = annotation as? ATMapMarker else {
- // return nil
- // }
-
-
- if let myitemAnnotation = annotation as? MyMAPointAnnotation {
- print("markerItemsfsfdsytp--AT-\(myitemAnnotation.itemMarker.markerType)---\(String(describing: myitemAnnotation.itemMarker.markerName))---\(String(describing: myitemAnnotation.itemMarker.tags))--")
- if myitemAnnotation.itemMarker.markerType.isMapAchorPoint {
- let annotationView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAnnotationAnchorPointView.identifier) as? MapAnnotationAnchorPointView) ?? MapAnnotationAnchorPointView(annotation: (myitemAnnotation as MAAnnotation), reuseIdentifier: MapAnnotationAnchorPointView.identifier)
- annotationView!.marker = myitemAnnotation.itemMarker
- return annotationView
- } else if (myitemAnnotation.itemMarker.markerType.isTracePopup) {
- let annotationBubbleView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAmapPopUpWindowView.identifier) as? MapAmapPopUpWindowView) ?? MapAmapPopUpWindowView(annotation: (myitemAnnotation as MAAnnotation), reuseIdentifier: MapAmapPopUpWindowView.identifier)
- annotationBubbleView!.marker = myitemAnnotation.itemMarker
- return annotationBubbleView
- }
- let annotationView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAmapMarkerNormalView.identifier) as? MapAmapMarkerNormalView) ?? MapAmapMarkerNormalView(annotation: (myitemAnnotation as MAAnnotation), reuseIdentifier: MapAmapMarkerNormalView.identifier)
- annotationView!.marker = myitemAnnotation.itemMarker
- return annotationView
- }
- return nil
- }
-
- func mapView(_ mapView: MAMapView!, rendererFor overlay: MAOverlay!) -> MAOverlayRenderer! {
- guard let polyline = overlay as? MyMAPolyline else {
- return MAPolylineRenderer(polyline: overlay as? MAPolyline)
- }
-
- // 外层边框(粗线)
- // let borderRenderer = MAPolylineRenderer(polyline: polyline)
- // borderRenderer?.lineWidth = 8
- // borderRenderer?.strokeColor = UIColor(red: 0.35, green: 0.36, blue: 0.99, alpha: 1)
- //
- let renderer = MAPolylineRenderer(polyline: polyline)
- renderer?.lineWidth = 12
- renderer?.lineCapType = kMALineCapRound//kMALineCapArrow
- renderer?.lineJoinType = kMALineJoinRound
-
- print("lineTypesfsdfsdf---\(polyline.itemPolyLine.lineType)----\(polyline.itemPolyLine.lineId)")
- // 设置箭头样式
- // 加载箭头纹理图片
- //normal error selected color
- if polyline.itemPolyLine.lineType == "normal" {
- renderer?.strokeImage = readImageContentFrom(imageName: "com.shishi.dingwei_bluearrow")
- //renderer?.strokeColor = UIColor(red: 0.27, green: 0.46, blue: 1, alpha: 1)
- } else if polyline.itemPolyLine.lineType == "error" {
- //renderer?.strokeColor = UIColor(red: 1, green: 0.43, blue: 0.43, alpha: 1)
- renderer?.strokeImage = readImageContentFrom(imageName: "com.shishi.dingwei_redarrow")
- } else if polyline.itemPolyLine.lineType == "selected" {
- //renderer?.strokeColor = UIColor(red: 0.08, green: 0.8, blue: 0.63, alpha: 1)
- renderer?.strokeImage = readImageContentFrom(imageName: "com.shishi.dingwei_greetarrow")
- } else if polyline.itemPolyLine.lineType == "color" {
- renderer?.strokeColor = UIColor(red: 0.27, green: 0.46, blue: 1, alpha: 1)
- renderer?.lineWidth = polyline.itemPolyLine.width
- renderer?.sideColor = UIColor(red: 0.35, green: 0.36, blue: 0.99, alpha: 1)
- renderer?.is3DArrowLine = true
- renderer?.fillColor = UIColor(hex: polyline.itemPolyLine.color)//UIColor.init(hex: "#4476FF");//UIColor(red: 123 / 255, green: 125 / 255, blue: 255 / 255, alpha: 1)
- }
- return renderer
- }
-
-
- func mapView(_ mapView: MAMapView, didFailToLocateUserWithError error: Error?) {
- guard let error = error else { return }
-
- // 打印错误信息,便于调试
- print("定位失败: \(error.localizedDescription)")
-
- // 根据错误类型处理黑屏问题
- handleLocationError(error: error as NSError)
-
- // 即使定位失败,也显示默认地图(避免黑屏)
- mapView.showsUserLocation = true // 显示用户位置(即使定位失败)
- mapView.userTrackingMode = .follow // 设置跟踪模式
- }
-
-
- private func handleLocationError(error: NSError) {
- switch error.code {
- case CLError.denied.rawValue:
- // 权限被拒绝
- showPermissionAlert()
- print("权限被拒绝")
-
- case CLError.locationUnknown.rawValue:
- // 位置未知(临时错误)
- print("位置未知(临时错误)")
-
- case CLError.network.rawValue:
- // 网络错误
- print("网络错误")
-
- case CLError.headingFailure.rawValue:
- // 方向获取失败(不影响定位,可忽略)
- print("方向获取失败,但位置可能正常")
-
- default:
- // 其他错误
- print("其他错误")
- }
- }
-
- private func readImageContentFrom(imageName : String) -> UIImage {
- if let image = UIImage(named: imageName) {
- return image
- }
-
- // 尝试从插件资源束加载
- let bundleURL = Bundle(for: MapAmapMarkerNormalView.self).url(forResource: "map_amap_ios_image_source", withExtension: "bundle")
- if let bundleURL = bundleURL, let resourceBundle = Bundle(url: bundleURL) {
- return UIImage(named: imageName, in: resourceBundle, compatibleWith: nil) ?? UIImage()
- }
-
- return UIImage()
- }
-
-
- private func showPermissionAlert() {
- let alert = UIAlertController(
- title: "定位权限被拒绝",
- message: "请在设置中为高德地图开启位置权限",
- preferredStyle: .alert
- )
-
- alert.addAction(UIAlertAction(title: "取消", style: .cancel))
- alert.addAction(UIAlertAction(title: "去设置", style: .default) { _ in
- // 打开系统设置中的应用权限页面
- if let url = URL(string: UIApplication.openSettingsURLString) {
- UIApplication.shared.open(url)
- }
- })
-
- present(alert, animated: true)
- }
-
-
- private func showDefaultMap() {
- // 如果有历史位置,使用历史位置
- if let lastLocation = self.autonaviMap.userLocation.location {
- let region = MACoordinateRegion(
- center: lastLocation.coordinate,
- span: MACoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
- )
- autonaviMap.setRegion(region, animated: true)
- } else {
- // 没有历史位置,使用默认区域(如北京)
- let defaultLocation = CLLocationCoordinate2D(latitude: 39.9042, longitude: 116.4074)
- let region = MACoordinateRegion(
- center: defaultLocation,
- span: MACoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
- )
- autonaviMap.setRegion(region, animated: true)
- }
-
- // 确保地图可见元素正常显示
- autonaviMap.isShowsBuildings = true
- autonaviMap.isShowTraffic = false // 根据需要显示交通
- }
- }
- /*
- @available(iOS 13.0, *)
- extension MapAmapThemeControl: MKMapViewDelegate {
- func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
- guard let marker = annotation as? ATMapMarker else {
- return nil
- }
- print("markerTypesfdsdfs---\(marker.markerType.markType)");
- if marker.markerType.isMapAchorPoint {
- let annotationView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAnnotationAnchorPointView.identifier) as? MapAnnotationAnchorPointView) ?? MapAnnotationAnchorPointView(annotation: marker, reuseIdentifier: MapAnnotationAnchorPointView.identifier)
- annotationView.marker = marker
- annotationView.prepareForDisplay()
- return annotationView
- } else if (marker.markerType.isTracePopup) {
- let annotationBubbleView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAmapPopUpWindowView.identifier) as? MapAmapPopUpWindowView) ?? MapAmapPopUpWindowView(annotation: marker, reuseIdentifier: MapAmapPopUpWindowView.identifier)
- annotationBubbleView.marker = marker
- annotationBubbleView.prepareForDisplay()
- return annotationBubbleView
- }
- let annotationView = (mapView.dequeueReusableAnnotationView(withIdentifier: MapAmapMarkerNormalView.identifier) as? MapAmapMarkerNormalView) ?? MapAmapMarkerNormalView(annotation: marker, reuseIdentifier: MapAmapMarkerNormalView.identifier)
- annotationView.marker = marker
- annotationView.prepareForDisplay()
- return annotationView
- }
- func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
- guard var marker = view.annotation as? ATMapMarker else {
- return
- }
-
- viewModel.handleMarkerTap(marker: &marker)
- }
- func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
-
- guard let polyline = overlay as? MKPolyline else {
- return MKOverlayRenderer(overlay: overlay)
- }
- let renderer = MapAmapArrowPolylineRenderer(polyline: polyline)
- renderer.lineWidth = 6
- //rgba(123, 125, 255, 1)
- renderer.strokeColor = UIColor(red: 0.27, green: 0.46, blue: 1, alpha: 1)//UIColor.init(hex: "#4476FF");//UIColor(red: 123 / 255, green: 125 / 255, blue: 255 / 255, alpha: 1)
- renderer.lineCap = .round
- renderer.lineJoin = .round
-
- // 设置箭头样式
- renderer.arrowColor = UIColor.white // 箭头颜色
- renderer.arrowSize = 12 // 增大箭头大小
- renderer.arrowSpacing = 50 // 减小箭头间距
- renderer.borderWidth = 1
- renderer.borderColor = UIColor(red: 0.35, green: 0.36, blue: 0.99, alpha: 1)
-
- //normal error selected color
- if polyline.associatedLineType == "normal" {
- renderer.strokeColor = UIColor(red: 0.27, green: 0.46, blue: 1, alpha: 1)
- } else if polyline.associatedLineType == "error" {
- renderer.strokeColor = UIColor(red: 1, green: 0.43, blue: 0.43, alpha: 1)
- } else if polyline.associatedLineType == "selected" {
- renderer.strokeColor = UIColor(red: 0.08, green: 0.8, blue: 0.63, alpha: 1)
- } else if polyline.associatedLineType == "color" {
- renderer.strokeColor = UIColor(hex: polyline.associatedColor ?? "#4476FF")
- renderer.lineWidth = polyline.associatedWidth ?? 0
- }
- return renderer
- }
- }*/
|