רכיב חיפוש מתקדם של מקומות

הגרסה המתקדמת של רכיב חיפוש המקומות מציעה את אותן תכונות כמו Place Search Essentials. בנוסף, אפשר להגדיר את לחצני הפעולה של הרכיב ולהחיל אפשרויות חיפוש וסינון על הביקורות והמדיה שמופיעות.

הגדרה מתקדמת של חיפוש מקומות

כדי לקבל גישה לתכונות המתקדמות, צריך להשתמש ב-AdvancedPlaceSearchView.

הגדרת לחצני פעולה

כדי להסיר או להתאים אישית את לחצני הפעולה, משתמשים בשיטות .cornerActions ו-.mainActions של AdvancedPlaceSearchView.

דרישות לייחוס חזותי

תצוגה של חיפוש מקומות מתקדם עם כפתורים בהתאמה אישית
תוצאה של חיפוש מקומות עם לחצן מותאם אישית

חשוב: עליכם להבהיר למשתמשים מתי לחצן פעולה מותאם אישית ישתף את פרטי המשתמש עם צד שלישי שאינו Google. דרישות לגבי שיוך חזותי

בדוגמה מוצגת תמונה בהתאמה אישית שבה מצוין בבירור שפרטי המשתמש יישלחו אל Altostrat.

שימוש באפשרויות חיפוש וסינון

משתמשים בשיטות .searchMediaOptions ו-.searchReviewOptions של AdvancedPlaceSearchView כדי להפעיל חיפוש וסינון של מדיה או ביקורות.

דוגמאות לחיפוש מתקדם של מקומות

יצירת כפתור פעולה ראשי והסרת פעולות בפינה

בדוגמת הקוד הזו נוצר לחצן פעולה ראשי לסימון מקום כמועדף או לביטול הסימון שלו כמועדף. בנוסף, המדיניות הזו מבטיחה שלא מוגדרות פעולות בפינות.

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