Mit POIs interagieren

Foto, das ein kleines Pop-over mit Ortsdetails am unteren Bildschirmrand zeigt, das durch Tippen aufgerufen wurde.

Wenn ein Nutzer auf einen POI in einer Map tippt, zeigt das Maps 3D SDK for iOS (GoogleMaps3DKit) ein Places-Widget für diesen POI an. Sie können auf Tippereignisse warten und mit onTap(_:), onPlaceTap(_:) und placeInformationEnabled(_:) steuern, ob dieses Widget angezeigt wird.

Auf Tippereignisse warten

Wenn Sie auf Tipp-Ereignisse auf einem Map warten möchten, wenden Sie den Modifikator onTap(_:) an.

Wenn ein Nutzer auf die Karte tippt, erhält der Closure ein MapTapInfo-Objekt mit den folgenden Properties:

Places UI-Widget steuern

Wenn Sie festlegen möchten, ob das integrierte Places-UI-Widget angezeigt wird, wenn ein Ort angetippt wird, wenden Sie onPlaceTap(_:) auf Map an. Der Closure empfängt das angetippte placeId (String) und gibt ein PlaceTapAction zurück:

  • Return .default: Zeigt das integrierte Places UI-Widget an.
  • Return .none: Das integrierte Places UI-Widget wird unterdrückt.

Im folgenden Beispiel wird auf Tippereignisse gewartet und das Standard-UI-Widget für Orte unterdrückt:

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)")
        }
      }
  }
}

Wenn Sie die integrierte Ortsinformationskarte für alle POI-Tippaktionen auf einer Map deaktivieren möchten, übergeben Sie false an placeInformationEnabled(_:):

import GoogleMaps3DKit
import SwiftUI

struct ContentView: View {
  var body: some View {
    Map(mode: .hybrid)
      .placeInformationEnabled(false)
  }
}