import MapKit import SwiftUI struct AttachmentLocationPickerView: View { @StateObject var locationManager = LocationManager() @State private var region = MKCoordinateRegion() var body: some View { ZStack { // MapView MapView(region: $region) .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.region = locationManager.region } } .overlay { Image(systemName: "mappin") .foregroundColor(.Material.Elements.active) .font(.system(size: 30)) .shadow(color: .white, radius: 2) } // Track button VStack { Spacer() HStack { Spacer() Image(systemName: "location.circle") .resizable() .frame(width: 40, height: 40) .foregroundColor(.Material.Elements.active) .background(Color.Material.Shape.white) .clipShape(Circle()) .shadow(color: .white, radius: 2) .padding(.trailing) .padding(.bottom, 50) .tappablePadding(.symmetric(10)) { self.region = locationManager.region } } } } .onAppear { locationManager.start() } } } struct MapView: UIViewRepresentable { @Binding var region: MKCoordinateRegion func makeUIView(context: Context) -> MKMapView { let mapView = MKMapView() mapView.delegate = context.coordinator mapView.showsUserLocation = false 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, CLLocationManagerDelegate { 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() } 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 } }