mapkit - 如何让用户在地图上添加图钉并在 SwiftUI 中获取坐标?
问题描述
我在以芝加哥为中心的视图中有一张地图。我希望用户能够在地图上放置图钉/注释,然后检索这些坐标。地图加载芝加哥很好,但我无法让注释代码工作。
具体来说,我似乎找不到 SwiftUI 的答案。只有 Swift 和 Storyboard。我觉得我有 99% 的代码,但这些部分不在正确的位置。我附上了错误所在的屏幕截图。谢谢你的帮助。
import SwiftUI
import MapKit
struct EntireMapView: UIViewRepresentable {
func updateUIView(_ mapView: MKMapView, context: Context) {
mapView.delegate = context.coordinator
let longPressGesture = UILongPressGestureRecognizer(target: mapView, action: #selector(EntireMapViewCoordinator.addAnnotation(gesture:)))
mapView.addGestureRecognizer(longPressGesture)
let span = MKCoordinateSpan(latitudeDelta: 0.3, longitudeDelta: 0.3)
var chicagoCoordinate = CLLocationCoordinate2D()
chicagoCoordinate.latitude = 41.878113
chicagoCoordinate.longitude = -87.629799
let region = MKCoordinateRegion(center: chicagoCoordinate, span: span)
mapView.setRegion(region, animated: true)
}
func makeUIView(context: Context) -> MKMapView {
let mapView = MKMapView(frame: .zero)
mapView.delegate = context.coordinator
return mapView
}
func makeCoordinator() -> EntireMapViewCoordinator {
return EntireMapViewCoordinator(self)
}
class EntireMapViewCoordinator: NSObject, MKMapViewDelegate {
var entireMapViewController: EntireMapView
init(_ control: EntireMapView) {
self.entireMapViewController = control
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
return (annotation as? MKAnnotationView)!
}
@objc func addAnnotation(gesture: UILongPressGestureRecognizer) {
if gesture.state == .ended {
let point = gesture.location(in: self.mapView) **<--- ERROR HERE**
let coordinate = mapView.convert(point, toCoordinateFrom: mapView)
var annotation = MKPointAnnotation()
annotation.coordinate = coordinate
self.mapView.addAnnotation(annotation) **<--- ERROR HERE**
}
}
}
}
struct EntireMapView_Previews: PreviewProvider {
static var previews: some View {
EntireMapView()
}
}
解决方案
这是答案的完整代码。功劳主要归功于 @yeezy ,因为使用这条线获得视图:let mapView = gestureRecognizer.view as? MKMApView
是问题中的主要错误。
struct EntireMapView: UIViewRepresentable {
func updateUIView(_ mapView: MKMapView, context: Context) {
let span = MKCoordinateSpan(latitudeDelta: 0.3, longitudeDelta: 0.3)
var chicagoCoordinate = CLLocationCoordinate2D()
chicagoCoordinate.latitude = 41.878113
chicagoCoordinate.longitude = -87.629799
let region = MKCoordinateRegion(center: chicagoCoordinate, span: span)
mapView.setRegion(region, animated: true)
}
func makeUIView(context: Context) -> MKMapView {
let myMap = MKMapView(frame: .zero)
let longPress = UILongPressGestureRecognizer(target: context.coordinator, action: #selector(EntireMapViewCoordinator.addAnnotation(gesture:)))
longPress.minimumPressDuration = 1
myMap.addGestureRecognizer(longPress)
myMap.delegate = context.coordinator
return myMap
}
func makeCoordinator() -> EntireMapViewCoordinator {
return EntireMapViewCoordinator(self)
}
class EntireMapViewCoordinator: NSObject, MKMapViewDelegate {
var entireMapViewController: EntireMapView
init(_ control: EntireMapView) {
self.entireMapViewController = control
}
@objc func addAnnotation(gesture: UIGestureRecognizer) {
if gesture.state == .ended {
if let mapView = gesture.view as? MKMapView {
let point = gesture.location(in: mapView)
let coordinate = mapView.convert(point, toCoordinateFrom: mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
mapView.addAnnotation(annotation)
}
}
}
}
}
推荐阅读
- python - TensorFlow LSTM 长度输出
- c# - 使用 .NET Core 3.1 和 HttpContext 的客户端 IP 地址错误
- python - 有一个词库来检查一种语言会不会非常低效?
- git - pubspec.yaml 中来自 git 的两个依赖项
- excel - 隐藏行子需要永远
- gitlab-ci - 如何将 Gitlab Runner 与物理服务器/环境相关联?
- angular - 我想使用 href 来决定需要打开哪个模式
- spring-boot - 在 JBoss EAP 7.3 中连接到本地 ActiveMQ Artemis 队列
- rabbitmq - 无法在 RabbitMQ 中加入集群
- shell - 通过 shell 删除 HDFS 上的文件,其中文件名包含低于给定值的数字