diff --git a/ConversationsClassic/View/Screens/Attachments/AttachmentLocationPickerView.swift b/ConversationsClassic/View/Screens/Attachments/AttachmentLocationPickerView.swift index c073f96..1dc63db 100644 --- a/ConversationsClassic/View/Screens/Attachments/AttachmentLocationPickerView.swift +++ b/ConversationsClassic/View/Screens/Attachments/AttachmentLocationPickerView.swift @@ -3,34 +3,63 @@ import SwiftUI struct AttachmentLocationPickerView: View { @StateObject var locationManager = LocationManager() - @State var region = MKCoordinateRegion() + @State private var region = MKCoordinateRegion() + @State private var userInteraction = false var body: some View { ZStack { - MapView(region: $region) + // MapView + MapView( + region: $region, + userInteraction: $userInteraction + ) + + // Track button + let img = userInteraction ? "location.circle" : "location.circle.fill" + VStack { + Spacer() + HStack { + Spacer() + Image(systemName: img) + .resizable() + .frame(width: 30, height: 30) + .foregroundColor(.Material.Elements.active) + .background(Color.Material.Shape.white) + .clipShape(Circle()) + .padding(16) + .shadow(color: .white, radius: 2) + .tappablePadding(.symmetric(10)) { + userInteraction = false + } + } + } } .onAppear { locationManager.start() } .onChange(of: locationManager.region) { region in - self.region = region + if !userInteraction { + self.region = region + } } } } struct MapView: UIViewRepresentable { @Binding var region: MKCoordinateRegion + @Binding var userInteraction: Bool func makeUIView(context: Context) -> MKMapView { let mapView = MKMapView() mapView.delegate = context.coordinator - mapView.showsUserLocation = true + mapView.showsUserLocation = false mapView.userTrackingMode = .none + return mapView } func updateUIView(_ uiView: MKMapView, context _: Context) { - if uiView.region != region { + if uiView.region != region, !userInteraction { uiView.setRegion(region, animated: true) } } @@ -48,7 +77,7 @@ struct MapView: UIViewRepresentable { } } -class LocationManager: NSObject, ObservableObject { +class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate { private let locationManager = CLLocationManager() @Published var region: MKCoordinateRegion @@ -67,9 +96,7 @@ class LocationManager: NSObject, ObservableObject { func stop() { locationManager.stopUpdatingLocation() } -} -extension LocationManager: CLLocationManagerDelegate { func locationManager(_: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let loc = locations.first { region = MKCoordinateRegion(