地図を表示する
Published by @SoNiceInfo at 6/24/2020
地図を表示するにはMapKit
を使います。
iOS 14対応
Map(coordinateRegion: Binding<MKCoordinateRegion>)
でマップを表示することができます。
下のスクリーンショットと同じ結果になります。
import SwiftUI
import MapKit
struct ContentView: View {
@State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 35.655164046, longitude: 139.740663704), span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1))
var body: some View {
Map(coordinateRegion: $region)
.edgesIgnoringSafeArea(.all)
}
}
iOS 13対応
UIViewRepresentable
でMKMapViewをSwiftUIで使えるようにする必要があります。
UIViewRepresentable
SwiftUIの標準機能で地図を表示することはできません。
地図を表示するにはMapKitを利用する必要があります。UIViewRepresentable
を使ってSwiftUIでMapKitを使えるようにします。UIViewRepresentable
はMapKitだけでなくUIKitをSwiftUIで使うときに使われます。
makeUIView
makeUIView
はUIKitのUIViewを初期化して作成するものです。
UIViewRepresentableの中で最初に1度だけ呼び出されます。
更新があったときなど2回目以降はupdateUIView
が呼び出されます。
ここではMapKitのMKMapView
を準備しています。
updateUIView
updateUIView
はViewで更新があったときなど2回目以降に呼び出されます。updateUIView
内で初期位置や縮尺を設定する必要があります。CLLocationCoordinate2D
は緯度と経度を表します。この例では東京タワーの緯度と経度を利用します。MKCoordinateSpan
は縮尺を表します。MKCoordinateRegion
で設定したい地図の緯度経度、縮尺を設定します。
最後にsetRegion()
でMKMapViweのuiViewに設定値を渡してあげます。
//
// ContentView.swift
//
import SwiftUI
import MapKit
struct ContentView: View {
var body: some View {
MapView()
.edgesIgnoringSafeArea(.all)
}
}
struct MapView: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView(frame: .zero)
}
func updateUIView(_ uiView: MKMapView, context: Context) {
let coordinate = CLLocationCoordinate2D(
latitude: 35.655164046, longitude: 139.740663704)
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let region = MKCoordinateRegion(center: coordinate, span: span)
uiView.setRegion(region, animated: true)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
参考
Creating and Combining Views — SwiftUI Tutorials | Apple Developer DocumentationMKMapView - MapKit | Apple Developer Documentation