MapKit - 显示用户位置和 MKPolygon 区域的问题
MapKit - problem with showing the user location and the MKPolygon Area
我在尝试显示用户位置和 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 放在项目上时出错的那一刻的代码,但问题是这样的。我希望有人能帮助我。
好的小子,问题已经被我自己解决了,哈哈。
我只是在 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()
}
}
希望如果有人遇到同样的问题可以看到这个片段来解决它
我在尝试显示用户位置和 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 放在项目上时出错的那一刻的代码,但问题是这样的。我希望有人能帮助我。
好的小子,问题已经被我自己解决了,哈哈。 我只是在 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()
}
}
希望如果有人遇到同样的问题可以看到这个片段来解决它