【问题标题】:MapKit - problem with showing the user location and the MKPolygon AreaMapKit - 显示用户位置和 MKPolygon 区域的问题
【发布时间】:2020-07-25 16:43:25
【问题描述】:

我在尝试显示用户位置和 MKPolygon 区域时遇到问题。

这是关于 MapView.swift 的代码:

import SwiftUI
import MapKit

let model = Model(filename: "ZONE_LIST")
var mapView = MKMapView() // (frame: UIScreen.main.bounds)

var theme = ""

struct MapView: UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        let latDelta = model.overlayTopLeftCoordinate.latitude - model.overlayBottomRightCoordinate.latitude

        let span = MKCoordinateSpan(latitudeDelta: fabs(latDelta), longitudeDelta: 0.99)
        let region = MKCoordinateRegion(center: model.midCoordinate, span: span)
        
        mapView.showsUserLocation = true
        
        mapView.region = region
        mapView.delegate = context.coordinator

        return mapView
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func updateUIView(_ uiView: MKMapView, context: UIViewRepresentableContext<MapView>) {}
}

协调器文件改为:

import MapKit

final class Coordinator: NSObject, MKMapViewDelegate {
    var parent: MapView

    init(_ parent: MapView) {
        self.parent = parent
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay is MKPolygon {
            let polygonView = MKPolygonRenderer(overlay: overlay)
            
            if theme == "Ciano" {
                polygonView.strokeColor = .cyan
                polygonView.fillColor = .cyan
            } else if theme == "Rosso" {
                polygonView.strokeColor = .init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0)
            } else if theme == "Verde" {
                polygonView.strokeColor = .init(red: 0/255, green: 255/255, blue: 0/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 0/255, green: 255/255, blue: 0/255, alpha: 1.0)
            } else if theme == "Magenta" {
                polygonView.strokeColor = .magenta
                polygonView.fillColor = .magenta
            } else if theme == "Giallo" {
                polygonView.strokeColor = .yellow
                polygonView.fillColor = .yellow
            } else if theme == "Arancione" {
                polygonView.strokeColor = .init(red: 255/255, green: 153/255, blue: 51/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 255/255, green: 153/255, blue: 51/255, alpha: 1.0)
            } else if theme == "Verde Turchese" {
                polygonView.strokeColor = .init(red: 50/255, green: 198/255, blue: 166/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 50/255, green: 198/255, blue: 166/255, alpha: 1.0)
            } else if theme == "Blu" {
                polygonView.strokeColor = .init(red: 0/255, green: 66/255, blue: 255/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 0/255, green: 66/255, blue: 255/255, alpha: 1.0)
            } else {
                polygonView.strokeColor = .init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
                polygonView.fillColor = .init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
            }
            polygonView.alpha = 0.5
            polygonView.lineWidth = 5.0
            
            return polygonView
          }
          return MKOverlayRenderer()
      }
  }

老实说,这是我在尝试将 UserLocation 放在项目上时遇到错误的确切时刻的代码,但问题是这样的。我希望有人可以帮助我。

【问题讨论】:

    标签: swift swiftui mapkit


    【解决方案1】:

    好的,小子,问题已经自己解决了,哈哈。 我只是将打印标记区域的代码放入 Coordinator.swift 文件中。

    final class Coordinator: NSObject, MKMapViewDelegate {
        var parent: MapView
    
        init(_ parent: MapView) {
            self.parent = parent
        }
    
        func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
            if overlay is ModelMapOverlay {
                return ModelMapOverlayView(overlay: overlay, overlayImage: UIImage(imageLiteralResourceName: "overlay_model"))
            } else if overlay is MKPolyline {
                let lineView = MKPolylineRenderer(overlay: overlay)
                lineView.strokeColor = .green
                return lineView
            } else if overlay is MKPolygon {
                let polygonView = MKPolygonRenderer(overlay: overlay)
                if theme == "Ciano" {
                    polygonView.strokeColor = .cyan
                    polygonView.fillColor = .cyan
                } else if theme == "Rosso" {
                    polygonView.strokeColor = .init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0)
                } else if theme == "Verde" {
                    polygonView.strokeColor = .init(red: 0/255, green: 255/255, blue: 0/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 0/255, green: 255/255, blue: 0/255, alpha: 1.0)
                } else if theme == "Magenta" {
                    polygonView.strokeColor = .magenta
                    polygonView.fillColor = .magenta
                } else if theme == "Giallo" {
                    polygonView.strokeColor = .yellow
                    polygonView.fillColor = .yellow
                } else if theme == "Arancione" {
                    polygonView.strokeColor = .init(red: 255/255, green: 153/255, blue: 51/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 255/255, green: 153/255, blue: 51/255, alpha: 1.0)
                } else if theme == "Verde Turchese" {
                    polygonView.strokeColor = .init(red: 50/255, green: 198/255, blue: 166/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 50/255, green: 198/255, blue: 166/255, alpha: 1.0)
                } else if theme == "Blu" {
                    polygonView.strokeColor = .init(red: 0/255, green: 66/255, blue: 255/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 0/255, green: 66/255, blue: 255/255, alpha: 1.0)
                } else {
                    polygonView.strokeColor = .init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
                    polygonView.fillColor = .init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
                }
                polygonView.alpha = 0.5
                polygonView.lineWidth = 5.0
                return polygonView
            } else if let character = overlay as? Character {
                let circleView = MKCircleRenderer(overlay: character)
                circleView.strokeColor = character.color
                return circleView
            }
            return MKOverlayRenderer()
        }
    }
    

    希望如果有人遇到同样的问题可以看到这个sn-p来解决它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多