Swiftui + Core Location:地图无法以用户为中心
Swiftui + Core Location: Map fails to center on user
我想在加载时使用以用户位置为中心的地图构建视图。我设法构建了这个,但 有时 地图加载纬度 0,经度:0。当我在视图之间移动太快时会发生这种情况(除了地图之外,项目中还有其他视图) .
感觉用户位置加载太慢了,地图显示默认坐标,但我真的不知道我做错了什么。有什么想法吗?
地图视图:
import SwiftUI
import MapKit
struct MapView: View {
@StateObject var locationManager = LocationManager()
@State var trackingMode: MapUserTrackingMode = .follow
var body: some View {
Map(coordinateRegion: $locationManager.region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $trackingMode)
}
}
位置视图模型:
import SwiftUI
import CoreLocation
import MapKit
class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var region = MKCoordinateRegion()
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
locations.last.map {
let center = CLLocationCoordinate2D(latitude: [=11=].coordinate.latitude, longitude: [=11=].coordinate.longitude)
let span = MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
region = MKCoordinateRegion(center: center, span: span)
}
}
}
这正是你的问题。位置数据将始终滞后,就像任何其他检索到的数据一样。您需要考虑的是一种在您获得更新时更新您的视图的机制。
最好的方法是 import Combine
在你的 LocationManager
class 中使用 PassthroughSubject
像这样:
let objectWillChange = PassthroughSubject<Void, Never>()
@Published var region = MKCoordinateRegion() {
willSet { objectWillChange.send() }
}
这样您就可以在地图中订阅您的发布者并获得更新。你会发现很多关于这个的教程。
我想在加载时使用以用户位置为中心的地图构建视图。我设法构建了这个,但 有时 地图加载纬度 0,经度:0。当我在视图之间移动太快时会发生这种情况(除了地图之外,项目中还有其他视图) .
感觉用户位置加载太慢了,地图显示默认坐标,但我真的不知道我做错了什么。有什么想法吗?
地图视图:
import SwiftUI
import MapKit
struct MapView: View {
@StateObject var locationManager = LocationManager()
@State var trackingMode: MapUserTrackingMode = .follow
var body: some View {
Map(coordinateRegion: $locationManager.region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $trackingMode)
}
}
位置视图模型:
import SwiftUI
import CoreLocation
import MapKit
class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var region = MKCoordinateRegion()
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
locations.last.map {
let center = CLLocationCoordinate2D(latitude: [=11=].coordinate.latitude, longitude: [=11=].coordinate.longitude)
let span = MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
region = MKCoordinateRegion(center: center, span: span)
}
}
}
这正是你的问题。位置数据将始终滞后,就像任何其他检索到的数据一样。您需要考虑的是一种在您获得更新时更新您的视图的机制。
最好的方法是 import Combine
在你的 LocationManager
class 中使用 PassthroughSubject
像这样:
let objectWillChange = PassthroughSubject<Void, Never>()
@Published var region = MKCoordinateRegion() {
willSet { objectWillChange.send() }
}
这样您就可以在地图中订阅您的发布者并获得更新。你会发现很多关于这个的教程。