SwiftUIにてContentViewとは、別のView(MapView)で現在位置を地図と情報として表示したいと考えています。
位置情報をprintで表示しているのですが、情報が”0”となってしまい読み取れません。
MKCoordinateRegion(center: __C.CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0), span: __C.MKCoordinateSpan(latitudeDelta: 0.0, longitudeDelta: 0.0))
アドバイスいただけると助かります。
SwiftUI
1MapLocationSearchApp.swift 2import SwiftUI 3 4@main 5struct MapLocationSearchApp: App { 6 var body: some Scene { 7 WindowGroup { 8 ContentView() 9 .environmentObject(LocationManager()) 10 } 11 } 12}
SwiftUI
1ContentView.swift 2import SwiftUI 3import MapKit 4 5struct ContentView: View { 6 7 var body: some View { 8 MapView() 9 .environmentObject(LocationManager()) 10 } 11} 12 13struct ContentView_Previews: PreviewProvider { 14 static var previews: some View { 15 ContentView() 16 } 17}
地図表示の初期の中心を現在位置と別の位置を指定して、userLocationを表示して地図上で差異を確認出来るようにしています。
SwiftUI
1MapView.swift 2import SwiftUI 3import MapKit 4 5struct MapView: UIViewRepresentable { 6 @EnvironmentObject var locationManager: LocationManager 7 @State var trackingMode = MapUserTrackingMode.follow 8 9 let map = MKMapView() 10 11 func makeUIView(context: Context) -> MKMapView { 12 // Tokyo 35.6804° N, 139.7690° E 13 // Tokyo Station 35.681236° N, 139.767125° E 14 let initCenter = CLLocationCoordinate2D(latitude: 35.681236, longitude: 139.767125) 15 let initRegion = MKCoordinateRegion(center: initCenter, latitudinalMeters: 10000, longitudinalMeters: 10000) 16 print("初期値:\(initRegion)") 17 18 map.region = initRegion 19 map.showsUserLocation = true 20 return map 21 22 } 23 24 func updateUIView(_ uiView: MKMapView, context: Context) { 25 print("更新後:\(locationManager.region)") 26 print("UserTrackingMode:\(trackingMode)") 27// uiView.region = locationManager.region //画面が青くなるので、コメントアウト 28 } 29} 30 31struct MapView_Previews: PreviewProvider { 32 static var previews: some View { 33 MapView(trackingMode: MapUserTrackingMode.none) 34 .environmentObject(LocationManager()) 35 } 36}
SwiftUI
1import SwiftUI 2import MapKit 3 4//現在地を取得するクラス 5class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate { 6 //ロケーションマネージャを作る 7 let manager = CLLocationManager() 8 //領域の更新をパブリッシュする 9 @Published var region = MKCoordinateRegion() 10 11 override init() { 12 super.init() //スーパークラスのイニシャライザ実行 13 manager.delegate = self //デリゲートの設定 14 manager.requestWhenInUseAuthorization() //プライバシー設定の確認 15 manager.desiredAccuracy = kCLLocationAccuracyBest 16 manager.distanceFilter = 2 //更新距離(m) 17 manager.startUpdatingHeading() //追従の開始 18 } 19 20 //領域の更新 21 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 22 //locationsの最後の要素に対して実行 23 locations.last.map { 24 let center = CLLocationCoordinate2D( 25 latitude: $0.coordinate.latitude, longitude: $0.coordinate.longitude) 26 print("coordinate: \($0.coordinate.latitude)\($0.coordinate.longitude)") 27 //領域の更新 28 region = MKCoordinateRegion( 29 center: center, 30 latitudinalMeters: 1000.0, 31 longitudinalMeters: 1000.0) 32 } 33 } 34}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。