Kit de IU de Places Details (experimental)

El kit de IU de Place Details te permite agregar un componente de IU individual que muestre los detalles de los lugares en tu app. El kit de IU se puede usar de forma independiente o en conjunto con otras APIs y servicios de Google Maps Platform. El kit de la IU toma un ID de lugar o coordenadas de latitud y longitud, y muestra la información renderizada de Place Details.
El kit de IU ofrece una vista compacta, que se puede mostrar horizontal o verticalmente. Puedes personalizar la apariencia de los detalles del lugar si proporcionas valores PlaceWidgetTheme
personalizados. También puedes personalizar qué campos de detalles del lugar se incluyen especificando una lista de entradas PlaceDetailsCompactView
, cada una de las cuales corresponde a un dato que se muestra sobre el lugar.
Facturación
Cuando usas el kit de IU de Place Details, se te factura por cada lugar que se carga con el widget. Si cargas el mismo lugar varias veces, se te facturará por cada solicitud.
Habilita el kit de IU de Places
Antes de usar el kit de IU de Places, debes hacer lo siguiente:
- Crea un proyecto de Cloud con una cuenta de facturación.
- Habilita la API de Places para tu proyecto.
- Obtén una clave de API.
Ejemplos del kit de IU de Place Details
El widget Place Details es una vista de IU de Swift. Puedes personalizar el estilo de la información de los detalles del lugar para que se adapte a tus necesidades y coincida con la apariencia de tu app.
Puedes especificar la orientación (horizontal o vertical), las anulaciones de temas y el contenido. Las opciones de contenido son medios, dirección, calificación, precio, tipo, entrada accesible, vínculo a Maps y vínculo a instrucciones sobre cómo llegar. [Ver un ejemplo de personalización]().
La posición predeterminada es vertical. Si deseas un diseño horizontal, especifica orientation: .horizontal
en PlaceDetailsCompactView
.
En este ejemplo, se crea una vista compacta con un diseño vertical.
// Callback for the place details widget. let placeDetailsCallback: (PlaceDetailsResult) -> Void = { result in if let place = result.place { print("Place: \(place.description)") } else { print("Error: \(String(describing: result.error))") } } @Environment(\.colorScheme) var colorScheme var customTheme = false var theme: PlaceWidgetTheme { if customTheme { var theme = PlaceWidgetTheme() theme.colorSurfaceContainerLowest = (colorScheme == .dark ? .blue : .gray) theme.colorOutlineDecorative = (colorScheme == .dark ? .white : .black) theme.colorOnSurface = (colorScheme == .dark ? .yellow : .red) theme.colorOnSurfaceVariant = (colorScheme == .dark ? .white : .blue) theme.colorOnSecondaryContainer = (colorScheme == .dark ? .white : .red) theme.colorSecondaryContainer = (colorScheme == .dark ? .green : .purple) theme.colorPositive = (colorScheme == .dark ? .yellow : .red) theme.colorPrimary = (colorScheme == .dark ? .yellow : .purple) theme.colorInfo = (colorScheme == .dark ? .yellow : .purple) theme.cornerRadius = 10 theme.labelLarge = .system(size: 15) theme.headlineMedium = .system(size: 14) theme.bodyLarge = .system(size: 13) theme.bodyMedium = .system(size: 12) theme.bodySmall = .system(size: 11) theme.attributionColorLight = .black theme.attributionColorDark = .white return theme } else { return PlaceWidgetTheme() } } @State var query: PlaceDetailsQuery = PlaceDetailsQuery( identifier: .placeID("ChIJT7FdmYiAhYAROFOvrIxRJDU")) var body: some View { PlaceDetailsCompactView( orientation: .vertical, query: $query, contentType: [.media(), .address(), .rating(), .type(), .price(), .accessibleEntranceIcon(), .mapsLink(), .directionsLink()], theme: theme, placeDetailsCallback: placeDetailsCallback, preferTruncation: false ) .frame(width: 350) }
En este ejemplo, se crea una vista compacta con un diseño horizontal.
// Callback for the place details widget. let placeDetailsCallback: (PlaceDetailsResult) -> Void = { result in if let place = result.place { print("Place: \(place.description)") } else { print("Error: \(String(describing: result.error))") } } @Environment(\.colorScheme) var colorScheme var customTheme = false var theme: PlaceWidgetTheme { if customTheme { var theme = PlaceWidgetTheme() theme.colorSurfaceContainerLowest = (colorScheme == .dark ? .blue : .gray) theme.colorOutlineDecorative = (colorScheme == .dark ? .white : .black) theme.colorOnSurface = (colorScheme == .dark ? .yellow : .red) theme.colorOnSurfaceVariant = (colorScheme == .dark ? .white : .blue) theme.colorOnSecondaryContainer = (colorScheme == .dark ? .white : .red) theme.colorSecondaryContainer = (colorScheme == .dark ? .green : .purple) theme.colorPositive = (colorScheme == .dark ? .yellow : .red) theme.colorPrimary = (colorScheme == .dark ? .yellow : .purple) theme.colorInfo = (colorScheme == .dark ? .yellow : .purple) theme.cornerRadius = 10 theme.labelLarge = .system(size: 15) theme.headlineMedium = .system(size: 14) theme.bodyLarge = .system(size: 13) theme.bodyMedium = .system(size: 12) theme.bodySmall = .system(size: 11) theme.attributionColorLight = .black theme.attributionColorDark = .white return theme } else { return PlaceWidgetTheme() } } @State var query: PlaceDetailsQuery = PlaceDetailsQuery( identifier: .placeID("ChIJT7FdmYiAhYAROFOvrIxRJDU")) var body: some View { PlaceDetailsCompactView( orientation: .horizontal, query: $query, contentType: [.media(), .address(), .rating(), .type(), .price(), .accessibleEntranceIcon(), .mapsLink(), .directionsLink()], theme: theme, placeDetailsCallback: placeDetailsCallback, preferTruncation: false ) .frame(width: 350) }
Ejemplo de personalización
En este ejemplo, se muestra cómo personalizar los atributos de diseño predeterminados.
// Callback for the place details widget. let placeDetailsCallback: (PlaceDetailsResult) -> Void = { result in if let place = result.place { print("Place: \(place.description)") } else { print("Error: \(String(describing: result.error))") } } @Environment(\.colorScheme) var colorScheme var theme: PlaceWidgetTheme { var theme = PlaceWidgetTheme() theme.colorSurfaceContainerLowest = (colorScheme == .dark ? .blue : .gray) theme.colorOutlineDecorative = (colorScheme == .dark ? .white : .black) theme.colorOnSurface = (colorScheme == .dark ? .yellow : .red) theme.colorOnSurfaceVariant = (colorScheme == .dark ? .white : .blue) theme.colorOnSecondaryContainer = (colorScheme == .dark ? .white : .red) theme.colorSecondaryContainer = (colorScheme == .dark ? .green : .purple) theme.colorPositive = (colorScheme == .dark ? .yellow : .red) theme.colorPrimary = (colorScheme == .dark ? .yellow : .purple) theme.colorInfo = (colorScheme == .dark ? .yellow : .purple) theme.cornerRadius = 10 theme.labelLarge = .system(size: 15) theme.headlineMedium = .system(size: 14) theme.bodyLarge = .system(size: 13) theme.bodyMedium = .system(size: 12) theme.bodySmall = .system(size: 11) theme.attributionColorLight = .black theme.attributionColorDark = .white return theme } @State var query: PlaceDetailsQuery = PlaceDetailsQuery( identifier: .placeID("ChIJT7FdmYiAhYAROFOvrIxRJDU")) var body: some View { PlaceDetailsCompactView( orientation: .vertical, query: $query, contentType: [.media(), .address(), .rating(), .type(), .price(), .accessibleEntranceIcon(), .mapsLink(), .directionsLink()], theme: theme, placeDetailsCallback: placeDetailsCallback, preferTruncation: false ) .frame(width: 350) }