【问题标题】:MapKit Showing current location with SwiftUI 2 (not using UIRepresentable)MapKit 使用 SwiftUI 2 显示当前位置(不使用 UIRepresentable)
【发布时间】:2020-12-31 01:44:11
【问题描述】:

试图让地图以当前位置为中心。它一遍又一遍地显示“更新的位置”,然后它不会将地图更改为当前位置。如果您滚动到当前位置,它会显示蓝点。

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")
   }
 }

【问题讨论】:

  • CLLocationManager 和地图视图是两种不同的动物。
  • 我编辑了代码以摆脱 CLLocationManager(因为它不是必需的)。使用上面的代码,它仍然做同样的事情。它会在我当前的位置放置一个蓝点,但地图不会自动转到那个点,它会显示在该地区设置的纬度/经度。如何让它自动显示当前位置? (info.plist 有正确的条目)
  • 哎呀!?不使用CLLocationManager,如何获取当前位置?
  • 那么如何让 CLLocationManager 与 Map 一起工作?这就是你所说的“两种不同的动物”的原始问题
  • 最初,您并没有在两者之间建立任何联系。您应该使用状态值将数据从一个传递到另一个。

标签: swiftui mapkit


【解决方案1】:

这似乎是答案。

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)!
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多