Erweiterte „Place Search“-Komponente

Die erweiterte Version der „Place Search“-Komponente bietet dieselben Funktionen wie Place Search Essentials. Außerdem können Sie die Aktionsschaltflächen der Komponente konfigurieren und Such- und Filteroptionen auf die angezeigten Rezensionen und Medien anwenden.

Erweiterte Konfiguration der Ortssuche

Über AdvancedPlaceSearchView können Sie auf erweiterte Funktionen zugreifen.

Aktionsschaltflächen konfigurieren

Verwenden Sie die Methoden .cornerActions und .mainActions von AdvancedPlaceSearchView, um die Aktionsschaltflächen zu entfernen oder anzupassen.

Anforderungen bezüglich visueller Quellenangaben

Ansicht „Erweiterte Suche“ mit benutzerdefinierten Schaltflächen
Ergebnis der Ortssuche mit benutzerdefinierter Schaltfläche

Wichtig:Sie müssen Nutzern deutlich mitteilen, wenn über eine benutzerdefinierte Aktionsschaltfläche Nutzerinformationen an einen anderen Drittanbieter als Google weitergegeben werden. Weitere Informationen zu den Anforderungen an die visuelle Quellenangabe

Das Beispiel zeigt ein benutzerdefiniertes Bild, das deutlich macht, dass Nutzerinformationen an „Altostrat“ gesendet werden.

Such- und Filteroptionen anwenden

Verwenden Sie die Methoden .searchMediaOptions und .searchReviewOptions von AdvancedPlaceSearchView, um die Suche und Filterung von Medien oder Rezensionen zu ermöglichen.

Erweiterte Beispiele für die Suche nach Orten

Schaltfläche für Hauptaktion erstellen und Eckaktionen entfernen

In diesem Codebeispiel wird eine Schaltfläche für die Hauptaktion erstellt, mit der ein Ort als Favorit markiert oder aus den Favoriten entfernt werden kann. Außerdem wird so sichergestellt, dass keine Eckaktionen konfiguriert sind.

Swift

struct AdvancedPlaceSearchDemoView: View {
  private let configuration = AdvancedPlaceSearchConfiguration(
    content: [.address(), .rating(), .type()],
    preferTruncation: true, // default is false
    theme: PlacesMaterialTheme(),
    attributionPosition: .bottom, // default is top
    mediaSize = .medium, // default is .small
    selectable: true // default is false
  )
  // can also do let placeSearchViewRequest = .searchNearby(...) to  configure a searchNearby request
  @State private var placeSearchViewRequest = .searchByText(
    SearchByTextRequest(
      textQuery: "Googleplex",
      placeProperties: [.all],
      locationBias: CircularCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 0, longitude: 0),
        radius: 0
      )
    )
  )

  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceSearchView(
      orientation: .horizontal, // default is vertical
      request: placeSearchViewRequest,
      configuration: configuration
    )
    .onLoad { places in
      print("places: \(places)")
    }
    .onRequestError { error in
      print("error: \(error)")
    }
    .onPlaceSelected { place, index in
      print("place: \(place)")
      print("index: \(index)")
    }
    .mainActions { place in
      var actions: [MainPlaceActionElement] = []

      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart.fill"),
              label: "Unfavorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart"),
              label: "Favorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
    // Ensures that there are no corner actions.
    .cornerActions { _ in
      return []
    }
  }

  func toggleFavorite(_ placeID: String) {
    if favoritePlaces.contains(placeID) {
      favoritePlaces.remove(placeID)
    } else {
      favoritePlaces.insert(placeID)
    }
  }
}

        

Rezensionen und Medien filtern

In diesem Codebeispiel werden Suchergebnisse gefiltert, sodass nur Medien und Rezensionen angezeigt werden, in denen „Kaffee“ erwähnt wird.

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee", rankPreference: .newest)
  let searchReviewOptions = SearchReviewsOptions(query: "coffee", rankPreference: .newest)

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: [.media(), .reviews()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { _ in }
    )
    .searchMediaOptions(searchMediaOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
    .searchReviewsOptions(searchReviewsOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
  }