検索窓(TextField)、マップを表示するView(MapKit)を設置する
キーワードから緯度経度を検索 -> 緯度経度からピンの画面パーツ生成 -> ピンの画面パーツを地図画面に貼り付け
MapKitにはUIViewRepresentableを使用する
TextFieldでの文字入力と入力完了後(onCommit)の使い方を学ぶ
ContentView.swiftとMapView.swiftを作成する
SwiftUIのMapView.swiftを作成
アプリでMapを表示するにはMapKitをインポートする
MapKitは地図、衛星画像、ピン配置、住所から座標検索ができる
import SwiftUI import MapKit struct MapView: UIViewRepresentable { func makeUIView(context: Context) -> MKMapView { MKMapView() } func updateUIView(_ uiView: MKMapView, context: Context){ } } struct MapView_Previews: PreviewProvider { static var previews: some View { MapView() } }
UIViewRepresentableを記載すると、makeUIView(viewの作成)とupdateUIView(viewの変更、再描画)が必要になる
UIViewRepresentableは、MKMapViewを使うためのラッパー
### 検索キーワードの設定
MapView.swift
struct MapView: UIViewRepresentable { let searchKey: String func makeUIView(context: Context) -> MKMapView { MKMapView() } func updateUIView(_ uiView: MKMapView, context: Context){ print(searchKey) } } struct MapView_Previews: PreviewProvider { static var previews: some View { MapView(searchKey: "東京タワー") } }
ContentView.swift
struct ContentView: View { var body: some View { VStack { MapView(searchKey: "東京タワー") } } }
-> シュミレーターを立ち上げると”東京タワー”と表示される
シミュレータでプログラムが実行される順番
MyMapApp.swift -> ContentView.swift -> MapView.swift
### 検索キーワードから緯度経度を検索
func updateUIView(_ uiView: MKMapView, context: Context){ print(searchKey) let geocoder = CLGeocoder() geocoder.geocodeAddressString( searchKey , completionHandler: { (placemarks, error) in if let unwrapPlacemarks = placemarks, let firstPlacemark = unwrapPlacemarks.first , let location = firstPlacemark.location { let targetCoordinate = location.coordinate print(targetCoordinate) } }) }
追加
let pin = MKPointAnnotation() pin.coordinate = targetCoordinate pin.title = searchKey uiView.region = MKCoordinateRegion( center: targetCoordinate, latitudinalMeters: 500.0, longitudinalMeters: 500.0)
MKPointAnnotationはピンを置くための機能
地図の扱いは特殊ですね