import MapKit import SwiftUI struct AttachmentLocationPickerView: View { @StateObject var locationManager = LocationManager() @State var region = MKCoordinateRegion() var body: some View { ZStack { MapView(region: $region) } .onAppear { locationManager.start() } .onChange(of: locationManager.region) { region in self.region = region } } } struct MapView: UIViewRepresentable { @Binding var region: MKCoordinateRegion func makeUIView(context: Context) -> MKMapView { let mapView = MKMapView() mapView.delegate = context.coordinator mapView.showsUserLocation = true mapView.userTrackingMode = .none return mapView } func updateUIView(_ uiView: MKMapView, context _: Context) { if uiView.region != region { uiView.setRegion(region, animated: true) } } func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, MKMapViewDelegate { var parent: MapView init(_ parent: MapView) { self.parent = parent } } } class LocationManager: NSObject, ObservableObject { private let locationManager = CLLocationManager() @Published var region: MKCoordinateRegion override init() { region = MKCoordinateRegion() super.init() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest } func start() { locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() } func stop() { locationManager.stopUpdatingLocation() } } extension LocationManager: CLLocationManagerDelegate { func locationManager(_: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let loc = locations.first { region = MKCoordinateRegion( center: loc.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.002, longitudeDelta: 0.002) ) } } } extension MKCoordinateRegion: Equatable { public static func == (lhs: MKCoordinateRegion, rhs: MKCoordinateRegion) -> Bool { lhs.center.latitude == rhs.center.latitude && lhs.center.longitude == rhs.center.longitude && lhs.span.latitudeDelta == rhs.span.latitudeDelta && lhs.span.longitudeDelta == rhs.span.longitudeDelta } }