高度な Place Search コンポーネント
Place Search コンポーネントの Advanced バージョンは、Place Search Essentials と同じ機能を提供します。また、コンポーネントのアクション ボタンを設定したり、表示されるレビューやメディアに検索やフィルタリングのオプションを適用したりすることもできます。
高度な場所検索の設定
AdvancedPlaceSearchView を使用して、上級者向け機能にアクセスします。
アクション ボタンを設定する
AdvancedPlaceSearchView の .cornerActions メソッドと .mainActions メソッドを使用して、アクション ボタンを削除またはカスタマイズします。
視覚的な表示ルールの要件
重要: カスタム アクション ボタンが Google 以外の第三者とユーザー情報を共有する場合は、ユーザーに明確に伝える必要があります。ビジュアル アトリビューションの要件をご覧ください。
この例では、ユーザー情報が「Altostrat」に送信されることを明確に示すカスタム画像が表示されています。
検索とフィルタのオプションを適用する
AdvancedPlaceSearchView の .searchMediaOptions メソッドと .searchReviewOptions メソッドを使用して、メディアやレビューの検索とフィルタリングを有効にします。
高度なプレイス検索の例
メイン アクション ボタンを作成し、コーナー アクションを削除する
このコードサンプルでは、場所をお気に入りに追加または削除するためのメイン アクション ボタンを作成します。また、コーナー アクションが設定されていないことも確認します。
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) } } }
クチコミとメディアをフィルタする
このコードサンプルは、検索結果をフィルタして、「コーヒー」に言及しているメディアとレビューのみを表示します。
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)") } } }