😪

SwiftUI向けのMapKitの使い方

2024/07/10に公開

マップの追加方法

import Swift
import MapKit

struct ContentView: View {
    var body: some View {
        Map() 
    }
}

こんな感じでマップを追加することができます!

コンテンツの表示

MapContentBuilderクロージャを使ってマップにマーカーを追加します。

import Swift
import MapKit

struct ContentView: View {
    var body: some View {
        Map() {
             Marker("Parking", coordinate: .parking)
        }
    }
}

Marker("(名前)", coordinate: "(座標)"), という風に追加することができます。

マップ上で場所の雰囲気を伝える

マップ上で場所の雰囲気を伝えるようにする為、mapStyleを使って:

  • 現実的な地形標高を表示させる
  • 上空からの画像を表示させる
import Swift
import MapKit

struct ContentView: View {
    var body: some View {
        Map() {
             Marker("Parking", coordinate: .parking)
        }
        .mapStyle(.standard(elevation: .realistic))
    }
}

mapStyleを駆使することで、よりアプリに現実味を出すことができます。

こんな感じです!
逆にmapStyleをstandardからimageryに変えると...

こんな風にすることもできます。

カメラのポジションを設定する

ユーザーの位置を追うカメラポジション

position = .userlocation(fallback: .automatic)

ポジションの指定

@State var position: MapCameraPosition

var body: some View {
  Map(position: $position)
}

カメラをポジションさせる

表示させる場所やリージョンを指定する

  • automatic
  • region(MKCoordinateRegion)
  • rect(MKMapRect)
  • item(MKMapItem)
  • camera(MapCamera)
  • userLocation()

ユーザーのアクションに伴わせる

  • positionedByUser

現在地の取得

LocationManagerを使ってユーザーの現在地を取得します

public class LocationManager: NSObject, ObservableObject {
    
    private let backgroundSession = CLBackgroundActivitySession()
    private let updates = CLLocationUpdate.liveUpdates()
    
    @Published var lat: Double = 0
    @Published var lon: Double = 0
    
    @ObservedObject public static var shared = LocationManager()
    
    public let manager = CLLocationManager()
    
    public override init() {
        super.init()
    }
    
    public func requestAuthorization() {
        manager.requestWhenInUseAuthorization()
        manager.requestAlwaysAuthorization()
    }

Map Controls

Map()
        .mapControls {
            MapScaleView()
            MapUserLocationButton()
    }
Map()
        .mapControls {
            MapCompass()
                .mapControlVisibility(.visible)
            MapPitchButton()
                 .buttonBorderShape(.circular)
                 .tint(.purple)
         }
        .controlSize(.large)

参照

https://www.youtube.com/watch?v=efjxmrAIobU&ab_channel=AppleDeveloper

https://developer.apple.com/documentation/mapkit/mapscaleview/4234522-mapcontrols

Discussion