MKMapViewの利用
SwiftUIでUIKitの機能を利用する場合は、最初にUIViewRepresentableプロトコルを実装したViewを作成します。UIViewRepresentableプロトコルを使ってMKMapViewを表示してみましょう。
地図を表示するViewを作成する
UIViewRepresentableプロトコルを実装してMKMapViewを表示するViewを作成します。UIViewRepresentableプロトコル自体の仕様については、Appleのドキュメントで確認できます。
import SwiftUI
import MapKit // -------- ①
struct MapView: UIViewRepresentable {
// 東京駅
private var mapRegion = MKCoordinateRegion(center:
CLLocationCoordinate2D(latitude: 35.6809591, longitude: 139.7673068),
span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
// View初期化処理
func makeUIView(context: Context) -> MKMapView { // -------- ②
let mapView = MKMapView(frame: .zero)
mapView.region = mapRegion
mapView.selectableMapFeatures = [.physicalFeatures, .pointsOfInterest] // 選択できる地点
mapView.delegate = context.coordinator. // delegate設定
return mapView
}
// UI更新処理
func updateUIView(_ uiView: MKMapView, context: Context) {
}
// デリゲート設定
func makeCoordinator() -> MapViewCoordinator{ // -------- ③
MapViewCoordinator(self)
}
}
MKMapViewを利用するために最初にMapKitをインポートします(①)。Viewの初期化処理の中で、東京駅を中心とした領域をMKMapViewに指定して初期化します(②)。同時に地図上の選択できる地点をselectableMapFeaturesプロパティで指定します。サンプルでは、physicalFeatures(山脈、河川などの地形上の特徴)、pointsOfInterest(美術館、カフェ、公園など人が集まる地点)を指定できるようにしています。地図の機能も利用したいので、MKMapViewDelegateを実装したMapViewCoordinatorクラスの名前でデリゲートを定義します(③)。MapViewCoordinatorクラスでは、次のようにMKMapViewDelegateを実装したクラスを定義し、そのメソッド内に処理を記述します。
// MapViewのデリゲート
class MapViewCoordinator: NSObject, MKMapViewDelegate {
var mapView: MapView
init(_ control: MapView) {
self.mapView = control
}
# 以降はMKMapViewDelegateのメソッドで処理を記述
}
上記の手順でMKMapViewの機能をSwiftUIからも利用できるようになります。
地図を表示する
前項で作成したMapViewを画面に配置することで、地図を表示できます。
struct ContentView: View {
var body: some View {
VStack {
MapView().edgesIgnoringSafeArea(.all)
}
}
}
UIViewRepresentableプロトコルを実装して定義したViewは、SwiftUIのUI部品と同じように扱うことができます。
