Componente Advanced Place Search
A versão avançada do componente Place Search oferece os mesmos recursos do Place Search Essentials. Ela também permite configurar os botões de ação do componente e aplicar opções de pesquisa e filtragem às avaliações e mídias que aparecem.
Configuração do Advanced Place Search
UseAdvancedPlaceSearchView para acessar os recursos avançados.
Configurar botões de ação
Use os métodos .cornerActions e .mainActions de AdvancedPlaceSearchView para remover ou personalizar os botões de ação.
Requisitos de atribuição visual
Importante:você precisa deixar claro para os usuários quando um botão de ação personalizado compartilha informações do usuário com terceiros que não sejam o Google. Consulte os requisitos de atribuição visual.
O exemplo mostra uma imagem personalizada que deixa claro que as informações do usuário serão enviadas para "Altostrat".
Aplicar opções de pesquisa e filtragem
Use os métodos .searchMediaOptions e .searchReviewOptions de AdvancedPlaceSearchView para ativar a pesquisa e a filtragem de mídias ou avaliações.
Exemplos do Advanced Place Search
Criar um botão de ação principal e remover ações de canto
Este exemplo de código cria um botão de ação principal para favoritar ou desfavoritar um lugar. Ele também garante que nenhuma ação de canto seja configurada.
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) } } }
Filtrar avaliações e mídias
Este exemplo de código filtra os resultados da pesquisa para mostrar apenas mídias e avaliações que mencionam "café".
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)") } } }