کامپوننت جزئیات مکان پیشرفته

نسخه پیشرفته کامپوننت Place Details همان ویژگی‌های Places Details Essentials را ارائه می‌دهد. همچنین به شما امکان می‌دهد دکمه‌های عملیاتی کامپوننت را پیکربندی کنید و گزینه‌های جستجو و فیلتر را برای نظرات و رسانه‌های نمایش داده شده اعمال کنید.

پیکربندی پیشرفته جزئیات مکان

برای دسترسی به ویژگی‌های پیشرفته، AdvancedPlaceDetailsView یا AdvancedPlaceDetailsCompactView استفاده کنید.

پیکربندی دکمه‌های عملیاتی

از متدهای .cornerActions ‎ و .mainActions ‎ از AdvancedPlaceDetailsView یا AdvancedPlaceDetailsCompactView برای حذف یا سفارشی‌سازی دکمه‌های عملیاتی استفاده کنید.

الزامات انتساب بصری

جزئیات را با دکمه‌های سفارشی، نمای فشرده قرار دهید
نمای فشرده جزئیات مکان پیشرفته با دکمه سفارشی

مهم: شما باید برای کاربران نهایی روشن کنید که چه زمانی یک دکمه اقدام سفارشی، اطلاعات کاربر را با شخص ثالثی غیر از گوگل به اشتراک می‌گذارد. به الزامات انتساب بصری مراجعه کنید.

مثال سمت راست یک تصویر سفارشی را نشان می‌دهد که به وضوح نشان می‌دهد اطلاعات کاربر به «Altostrat» ارسال خواهد شد.

اعمال گزینه‌های جستجو و فیلتر

برای فعال کردن جستجو و فیلتر کردن رسانه‌ها یا نظرات، از متدهای .searchMediaOptions ‎ و .searchReviewOptions ‎ از AdvancedPlaceDetailsView ‎ یا AdvancedPlaceDetailsCompactView ‎ استفاده کنید.

مثال‌های جزئیات مکان پیشرفته

حذف دکمه‌های عملیاتی

سویفت

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 []
    }
  }
}

افزودن اقدامات سفارشی و از پیش تعریف شده

این نمونه، به همراه عملکرد از پیش تعریف‌شده‌ی «باز کردن در نقشه‌ها» ، گزینه‌ای را برای کاربر اضافه می‌کند تا بتواند یک مکان را به لیست علاقه‌مندی‌ها اضافه کند یا از لیست علاقه‌مندی‌ها حذف کند.

سویفت

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

فیلتر کردن نظرات و رسانه‌ها

این نمونه کد فقط رسانه‌ها و نقدهایی را نشان می‌دهد که به «قهوه» اشاره کرده‌اند.

سویفت

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