Я сделал простой UIViewRepresentable из MKMapView. Вы можете прокрутить вид карты, и на экране появятся координаты посередине.
Вот ContentView:
import SwiftUI
import CoreLocation
let london = CLLocationCoordinate2D(latitude: 51.50722, longitude: -0.1275)
struct ContentView: View {
@State private var center = london
var body: some View {
VStack {
MapView(center: self.$center)
HStack {
VStack {
Text(String(format: "Lat: %.4f", self.center.latitude))
Text(String(format: "Long: %.4f", self.center.longitude))
}
Spacer()
Button("Reset") {
self.center = london
}
}.padding(.horizontal)
}
}
}
Вот MapView:
struct MapView: UIViewRepresentable {
@Binding var center: CLLocationCoordinate2D
func makeUIView(context: Context) -> MKMapView {
let mapView = MKMapView()
mapView.delegate = context.coordinator
return mapView
}
func updateUIView(_ uiView: MKMapView, context: Context) {
uiView.centerCoordinate = self.center
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.center = mapView.centerCoordinate
}
init(_ parent: MapView) {
self.parent = parent
}
}
}
Нажатие на кнопку сброса должно просто установить mapView.center в Лондон. Текущий метод сделает прокрутку карты очень медленной, а когда нажата кнопка, возникает ошибка «Изменение состояния во время обновления вида, это приведет к неопределенному поведению».
Как следует сообщать об изменении координат MKMapView, так что прокрутка карты снова быстро, и ошибка исправлена?