微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MapKit 使用 SwiftUI 2 显示当前位置不使用 UIRepresentable

如何解决MapKit 使用 SwiftUI 2 显示当前位置不使用 UIRepresentable

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

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

解决方法

这似乎就是答案。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。