Komponent Informacje o miejscu – wersja zaawansowana

Wersja zaawansowana komponentu Informacje o miejscu oferuje te same funkcje co Informacje o miejscu – wersja Essentials. Umożliwia też skonfigurowanie przycisków działania komponentu oraz zastosowanie opcji wyszukiwania i filtrowania do wyświetlanych opinii i multimediów.

Konfiguracja komponentu Informacje o miejscu – wersja zaawansowana

Aby uzyskać dostęp do funkcji zaawansowanych, użyj AdvancedPlaceDetailsView lub AdvancedPlaceDetailsCompactView.

Konfigurowanie przycisków działania

Aby usunąć lub dostosować przyciski działania, użyj metod .cornerActions i .mainActions w AdvancedPlaceDetailsView lub AdvancedPlaceDetailsCompactView.

Wymagania dotyczące podania źródła w formie wizualnej

Kompaktowy widok informacji o miejscu z dostosowanymi przyciskami
Kompaktowy widok Informacji o miejscu – wersja zaawansowana z dostosowanym przyciskiem

Ważne: musisz wyraźnie poinformować użytkowników, kiedy niestandardowy przycisk działania będzie udostępniać informacje o użytkownikach innej firmie niż Google. Zapoznaj się z wymaganiami dotyczącymi podania źródła w formie wizualnej.

Przykład po prawej stronie pokazuje niestandardowy obraz, który wyraźnie informuje, że informacje o użytkownikach będą wysyłane do „Altostrat”.

Stosowanie opcji wyszukiwania i filtrowania

Aby włączyć wyszukiwanie i filtrowanie multimediów lub opinii, użyj metod .searchMediaOptions i .searchReviewOptions w AdvancedPlaceDetailsView lub AdvancedPlaceDetailsCompactView.

Przykłady komponentu Informacje o miejscu – wersja zaawansowana

Usuwanie przycisków działania

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ _ in
      return []
    }
  }
}

Dodawanie działań niestandardowych i predefiniowanych

Ten przykład dodaje opcję, która umożliwia użytkownikowi dodanie miejsca do ulubionych lub usunięcie go z ulubionych, a także predefiniowane działanie Otwórz w Mapach.

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  
  @State var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .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
    }
    .cornerActions { place in
      var actions: [CornerPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart.fill"),
              accessibilityLabel: "Unfavorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart"),
              accessibilityLabel: "Favorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
  }

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

Filtrowanie opinii i multimediów

Ten przykładowy kod pokazuje tylko multimedia i opinie, w których pojawia się słowo „kawa”.

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee")
  let searchReviewsOptions = SearchReviewsOptions(query: "coffee")

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