ShadowDES
ShadowDES

Reputation: 873

MapKit Showing current location with SwiftUI 2 (not using UIRepresentable)

Trying to get the map to center on the current location. It is showing "Updated Location" over and over again, it then doesn't change the map the current location. If you scroll to your current location, it shows the blue dot.

struct Home:View {

   @State var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 13.086, longitude: 80.2769), latitudinalMeters: 10000, longitudinalMeters: 10000)
   @State var trackingMode: MapUserTrackingMode = .follow
   @State var manager = CLLocationManager()
   @StateObject var managerDelegate = LocationDelegate()

   var body:some View {
       VStack {
           Map(coordinateRegion: $region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $trackingMode)
       }
       .onAppear {
          manager.delegate = managerDelegate
       }
   }
}


class LocationDelegate: NSObject, ObservableObject, CLLocationManagerDelegate {

   func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
       if manager.authorizationStatus == .authorizedWhenInUse {
           print("Authorized...")
           manager.startUpdatingLocation()
       } else {
           print("Not Authorized...")
           manager.requestWhenInUseAuthorization()
       }
   }

   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       print("Updated Location")
   }
 }

Upvotes: 1

Views: 289

Answers (1)

ShadowDES
ShadowDES

Reputation: 873

This appears to be the answer.

struct Home:View {

   @State var trackingMode: MapUserTrackingMode = .follow
   @State var manager = CLLocationManager()
   @StateObject var managerDelegate = LocationDelegate()

   var body:some View {
       VStack {
           Map(coordinateRegion: $managerDelegate.region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $trackingMode)
       }
       .onAppear {
           manager.delegate = managerDelegate
       }
   }
}

class LocationDelegate: NSObject, ObservableObject, CLLocationManagerDelegate         {

   @Published var  region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 13.086, longitude: 80.2769), latitudinalMeters: 10000, longitudinalMeters: 10000)

   func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
       if manager.authorizationStatus == .authorizedWhenInUse {
           print("Authorized...")
           manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
           manager.startUpdatingLocation()
       } else {
           print("Not Authorized...")
           manager.requestWhenInUseAuthorization()
       }
   }

   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       print("Updated Location")
       region.center.latitude = (manager.location?.coordinate.latitude)!
       region.center.longitude = (manager.location?.coordinate.longitude)!
   }
}

Upvotes: 0

Related Questions