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

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

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

Q&A

解決済

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

akaboshi
akaboshi

総合スコア5

2回答

0グッド

0クリップ

988閲覧

投稿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}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

swift

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

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

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

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

投稿2022/05/05 14:53

退会済みユーザー

退会済みユーザー

総合スコア0

akaboshi👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

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

投稿2022/05/06 06:18

akaboshi

総合スコア5

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る