ユーザーが Map でスポット(POI)をタップすると、Maps 3D SDK for iOS(GoogleMaps3DKit)にそのスポットの Place Widget が表示されます。タップイベントをリッスンし、onTap(_:)、onPlaceTap(_:)、placeInformationEnabled(_:) を使用してこのウィジェットの表示を制御できます。
タップイベントをリッスンする
Map でタップイベントをリッスンするには、onTap(_:) 修飾子を適用します。
ユーザーが地図をタップすると、クロージャは次のプロパティを含む MapTapInfo オブジェクトを受け取ります。
location: タップの地理座標と高度を表すLatLngAltitude。content: タップされた内容を示すMapTapInfo.Content値。MapTapInfo.Content.map: タップが基本地図にヒットしました。MapTapInfo.Content.place(id:): タップが場所をヒットし、その一意のプレイス ID(String)が提供されました。
Places UI ウィジェットを制御する
場所がタップされたときに組み込みの Places UI ウィジェットを表示するかどうかを制御するには、onPlaceTap(_:) を Map に適用します。クロージャは、タップされた placeId(String)を受け取り、PlaceTapAction を返します。
- Return
.default: 組み込みの Places UI ウィジェットを表示します。 - Return
.none: 組み込みの Places UI ウィジェットを抑制します。
次の例では、タップイベントをリッスンし、デフォルトの Places UI ウィジェットを抑制しています。
import GoogleMaps3DKit
import SwiftUI
struct ContentView: View {
@State private var camera = Camera(center: .init(latitude: 37.7749, longitude: -122.4194))
var body: some View {
Map(camera: $camera, mode: .hybrid)
.onPlaceTap { placeId in
// Suppress the built-in Places UI widget
.none
}
.onTap { tapInfo in
switch tapInfo.content {
case .map:
print("Tapped map at \(tapInfo.location)")
case .place(let placeId):
print("Tapped place \(placeId) at \(tapInfo.location)")
}
}
}
}
Map で POI をタップしたときに組み込みの場所情報カードが表示されないようにするには、false を placeInformationEnabled(_:) に渡します。
import GoogleMaps3DKit
import SwiftUI
struct ContentView: View {
var body: some View {
Map(mode: .hybrid)
.placeInformationEnabled(false)
}
}