Skip to main content

MapKit タップした地点の座標取得

座標を取得

swift
MapReader { reader in
Map {
..
}
.onTapGesture { screenCoord in
if let coord = reader.convert(screenCoord, from: .local) {
print(coord)
}
swift
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
if let placemark = placemarks?.first {
appData.selectedPlacemark = placemark
}
})

↑ 素直に書けばこのようにできるが よりイマドキの書き方としては、こうだろうか。 ↓

swift
let placemarks = try? await geoCoder.reverseGeocodeLocation(location)
if let placemark = placemarks?.first {
appData.selectedPlacemark = placemark
}
}

これを踏まえて ピン( annotation ) のタップとの組み合わせとしては、このようにすれば良さそう。

swift
MapReader { reader in
Map(position: Bindable(appData).cameraPos, selection: $appData.selectedPark) {
ForEach(appData.parks) { park in
Annotation(park.name, coordinate: park.coord, content: {
...
.onTapGesture { // A: ピンのタップ
isTappingPin = true
appData.selectedPark = park // なしでも選ばれるのだが、長押し気味にしないと反応しないため
}
}
})
.tag(park)
...
}
.onChange(of: appData.selectedPark) { _, v in
if v != nil {
appData.selectedPlacemark = nil
}
}
.onTapGesture { screenCoord in // B: マップのタップ
Task(priority: .low) { // A の追い抜き防止
if isTappingPin {
isTappingPin = false
return
}
if appData.selectedPark != nil {
return
}
if let coord = reader.convert(screenCoord, from: .local) {
appData.selectedPlacemark = await getPlacemarkAt(coord: coord)
}
}
}
}