Reputation: 873
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
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