如何将地图居中显示在当前位置Swift上



我对编码还很陌生,为了达到这一点,我已经在网上学习了多个教程,这可能导致我的代码混乱,所以我对此道歉。

我已经开始在家乡使用MapKit创建一个带有地图注释的应用程序。我目前住在国外,所以我的位置不是这些地图注释所在的地方。当我接受位置权限时,地图默认为第一个注释接点,我希望它默认为我的当前位置。

我的代码如下,如有任何帮助/解释,我们将不胜感激。

位置视图模型

'''class LocationsViewModel: ObservableObject {

@Published var locations: [Location]
@Published var mapLocation: Location {
didSet {
updateMapRegion(location: mapLocation)
}
}
@Published var mapRegion: MKCoordinateRegion = MKCoordinateRegion()
let mapSpan = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)

init() {
let locations = LocationsDataServices.locations
self.locations = locations
self.mapLocation = locations.first!
self.updateMapRegion(location: locations.first!)
}
private func updateMapRegion(location: Location) {
withAnimation(.easeInOut) {
mapRegion = MKCoordinateRegion(
center: location.coordinates,
span: mapSpan)
}
}
func showNextLocation(location: Location) {
withAnimation(.easeInOut) {
mapLocation = location

}
}
}'''

位置服务模型

'''import MapKit
enum MapDetails {
static let startingLocation = CLLocationCoordinate2D(latitude: ***, longitude: ***)
static let defaultSpan = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta:      0.05)
}
final class LocationServicesModel: NSObject, ObservableObject,  CLLocationManagerDelegate {

@Published var region = MKCoordinateRegion(center: MapDetails.startingLocation, span: MapDetails.defaultSpan)
var locationManager: CLLocationManager?
func checkIfLocationServicesIsEnabled() { 
if CLLocationManager.locationServicesEnabled() {
locationManager = CLLocationManager()
locationManager!.delegate = self 
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
} else {
print("turn on location manager")
}
}
private func checkLocationAuthorisation() { 
guard let locationManager = locationManager else { return }

switch locationManager.authorizationStatus {

case .notDetermined:
locationManager.requestWhenInUseAuthorization()
case .restricted:
print("location is restricted")
case .denied:
print("location has been denied, go into settings to change permission")
case .authorizedAlways, .authorizedWhenInUse:

break
@unknown default:
break
}
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
checkLocationAuthorisation()
}'''

代码在一定程度上起作用,地图注释放置正确,它确实显示了我的当前位置,但我不确定在接受位置权限而不是上面输入的坐标后,我会在哪里或如何将地图放在用户位置的中心。

谢谢!

一旦获得所需权限,就需要调用startUpdatingLocation()

locationManager.startUpdatingLocation()

这将开始生成报告用户当前位置的更新。这些更新可通过委托方法提供给您:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// Ensure we have an actual location in the update.
guard let location = locations.last else { return }
// Do something with the location.
}

该位置是CLLocation,您可以从中提取坐标。

let span = MKCoordinateSpan(latitudeDelta: 0.009, longitudeDelta: 0.009)
let region = MKCoordinateRegion(center: location.coordinate, span: span)
mapView.setRegion(region, animated: true)

最新更新