Swiftui + 核心位置:地图无法以用户为中心

Posted

技术标签:

【中文标题】Swiftui + 核心位置:地图无法以用户为中心【英文标题】:Swiftui + Core Location: Map fails to center on user 【发布时间】:2021-01-06 13:11:26 【问题描述】:

我想在加载时构建一个以用户位置为中心的地图视图。我设法构建了这个,但有时地图加载时纬度为 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: $0.coordinate.latitude, longitude: $0.coordinate.longitude)
            let span = MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
            region = MKCoordinateRegion(center: center, span: span)
        
    

【问题讨论】:

【参考方案1】:

这正是你的问题。位置数据总是会滞后,就像任何其他检索到的数据一样。您需要考虑的是一种在您获得更新时更新您的视图的机制。

最好的方法是在你的LocationManager 类中使用import Combine 并使用PassthroughSubject,如下所示:

let objectWillChange = PassthroughSubject<Void, Never>()
@Published var region = MKCoordinateRegion() 
    willSet  objectWillChange.send() 

这允许您订阅地图中的发布者并获取更新。你会发现很多关于这个的教程。

【讨论】:

感谢您的提示!它让我陷入了一个关于异步队列之类的非常深的兔子洞。我真的很想理解 Codable,但最后我从youtube.com/watch?v=q_srswdKouk 实现了一个解决方案。这不是很优雅,一旦加载位置,跟踪就会停止(否则位置更新会不断将地图捕捉回用户位置)。但这是一个单独的问题 继续努力。它变得更容易。话虽如此,Combine 可能很难进入。

以上是关于Swiftui + 核心位置:地图无法以用户为中心的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图以用户当前位置为中心加上默认位置作为备份

打开地图屏幕时,如何将 MapView 以用户当前位置为中心?反应原生博览会

如何在swiftUI中添加返回用户位置按钮?

MKUserTrackingButton - 如何在不缩小的情况下获取用户位置的中心地图?

谷歌地图 api 中心在我的位置上有一个按钮

将谷歌地图中心放在kml上,而不是位置