質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%

Q&A

解決済

2回答

2114閲覧

SwiftUIでの現在位置情報の取得

akaboshi

総合スコア5

0グッド

0クリップ

投稿2022/05/05 09:41

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

swift

1manager.startUpdatingHeading() //追従の開始

このメソッドを次のメソッドに変えてみたらどうでしょうか。
startUpdatingLocation()
https://developer.apple.com/documentation/corelocation/cllocationmanager/1423750-startupdatinglocation

locationManager(_:didUpdateLocations:) が動くようになると思います。

*Headingはコンパスの方向みたいです

投稿2022/05/05 14:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答有難うございます。
したかった動きをしました。とても助かりました。

投稿2022/05/06 06:18

akaboshi

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問