컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
장소 검색 구성요소
Places UI Kit의 장소 검색 구성요소는 장소 검색 결과를 목록에 렌더링합니다.
장소 검색 목록을 맞춤설정할 수 있습니다. 다음 항목을 지정할 수 있습니다.
- 표시할 콘텐츠
- 세로 방향의 미디어 크기
- 텍스트 자르기
- 방향
- 브랜드 및 앱의 디자인 언어와 일치하는 테마 재정의
- 저작자 표시의 위치
- 장소를 선택할 수 있는지 여부
Search by text request
또는 Search Nearby request
을 실행하도록 요청을 맞춤설정할 수도 있습니다.
결제
SearchByTextRequest()
또는 PlaceSearchViewRequest()
바인딩 값이 변경될 때마다 요금이 청구됩니다.
앱에 장소 검색 추가
PlaceSearchView class
를 사용하여 장소 검색 위젯을 추가합니다.
Swift
PlaceSearchView(
orientation: .horizontal, // default is vertical
request: $placeSearchViewRequest,
configuration: configuration
)
앱이 텍스트 검색 또는 주변 검색 결과를 로드하도록 하려면 PlaceSearchViewRequest
값을 업데이트합니다.
Swift
// use placeSearchViewRequest = .searchNearby(...) to configure a searchNearby request
@State private var let placeSearchViewRequest = .searchByText(
SearchByTextRequest(
textQuery: "Googleplex",
placeProperties: [.all],
locationBias: CircularCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 0, longitude: 0),
radius: 0
)
)
)
구성요소가 로드되거나, 장소가 선택되거나, 구성요소 로드에 오류가 있을 때 콜백을 수신할 수도 있습니다(선택사항).
Swift
.onLoad { places in
print("places: \(places)")
}
.onRequestError { error in
print("error: \(error)")
}
.onPlaceSelected { place in
print("place: \(place)")
}
장소 검색 구성요소 맞춤설정
콘텐츠 맞춤설정
구성요소가 표시할 콘텐츠를 지정해야 합니다.
이 예에서는 장소의 주소와 평점을 표시하도록 구성요소를 구성합니다.
Swift
private let configuration = PlaceSearchConfiguration(
content: [.address(), .rating()]
)
선택적으로 장소 검색 구성요소에 표시되는 콘텐츠의 다음 측면을 맞춤설정할 수도 있습니다.
content
: 구성요소에 표시되는 콘텐츠입니다.
mediaSize
: 프래그먼트의 세로 방향 사진 크기입니다. 기본값은 small입니다. 콘텐츠에 지정됨
preferTruncation
: 각 장소 세부정보 뷰의 텍스트를 자를지 여부입니다. 기본값은 false입니다.
theme
: PlacesMaterialTheme에서 상속되는 맞춤 테마입니다. 테마에 대해 자세히 알아보세요.
attributionPosition
: 구성요소의 상단 또는 하단에 Google 지도 저작자 표시를 표시할지 여부입니다. 기본값은 .top입니다.
selectable
: 목록의 각 장소를 선택할 수 있는지 여부입니다. 선택 가능한 경우 장소를 선택한 후 onPlaceSelected
클로저가 호출됩니다. 기본값은 false입니다.
PlaceSearchConfiguration
에 맞춤설정 구성을 추가합니다.
Swift
private let configuration = PlaceSearchConfiguration(
content: [.address, .rating, .media(size: .large)],
preferTruncation: true, // default is false
theme: PlacesMaterialTheme(),
attributionPosition: .bottom, // default is top
selectable: true // default is false
)
방향 맞춤설정
기본 방향은 세로입니다. PlaceSearchView
에서 가로 방향을 지정할 수 있습니다.
Swift
PlaceSearchView(
orientation: .horizontal, // default is vertical
request: $placeSearchViewRequest,
configuration: configuration
)
테마 맞춤설정
기본 스타일 속성을 재정의하는 테마를 지정할 수 있습니다. 기본값은 PlacesMaterialTheme
입니다. 테마에 관한 자세한 내용은 장소 세부정보 구성요소 문서를 참고하세요.
Swift
@Environment(\.colorScheme) var colorScheme
var theme: PlacesMaterialTheme {
if customTheme {
var theme = PlacesMaterialTheme()
var color = PlacesMaterialColor()
color.surface = (colorScheme == .dark ? .blue : .gray)
color.outlineDecorative = (colorScheme == .dark ? .white : .black)
color.onSurface = (colorScheme == .dark ? .yellow : .red)
color.onSurfaceVariant = (colorScheme == .dark ? .white : .blue)
color.onSecondaryContainer = (colorScheme == .dark ? .white : .red)
color.secondaryContainer = (colorScheme == .dark ? .green : .purple)
color.positive = (colorScheme == .dark ? .yellow : .red)
color.primary = (colorScheme == .dark ? .yellow : .purple)
color.info = (colorScheme == .dark ? .yellow : .purple)
var shape = PlacesMaterialShape()
shape.cornerRadius = 10
var font = PlacesMaterialFont()
font.labelLarge = .system(size: UIFontMetrics.default.scaledValue(for: 18))
font.headlineMedium = .system(size: UIFontMetrics.default.scaledValue(for: 15))
font.bodyLarge = .system(size: UIFontMetrics.default.scaledValue(for: 15))
font.bodyMedium = .system(size: UIFontMetrics.default.scaledValue(for: 12))
font.bodySmall = .system(size: UIFontMetrics.default.scaledValue(for: 11))
var attribution = PlacesMaterialAttribution()
attribution.lightModeColor = .black
attribution.darkModeColor = .white
theme.color = color
theme.shape = shape
theme.font = font
theme.attribution = attribution
} else {
return PlacesMaterialTheme()
}
}
예
Swift
struct PlaceSearchDemoView: View {
private let configuration = PlaceSearchConfiguration(
content: [.address(), .rating(), .type(), .media(size: .large)],
preferTruncation: true, // default is false
theme: PlacesMaterialTheme(),
attributionPosition: .bottom, // default is top
selectable: true // default is false
)
// can also do let placeSearchViewRequest = .searchNearby(...) to configure a searchNearby request
@State private var placeSearchViewRequest: PlaceSearchViewRequest = .searchByText(
SearchByTextRequest(
textQuery: "Googleplex",
placeProperties: [.all],
locationBias: CircularCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 0, longitude: 0),
radius: 0
)
)
)
var body: some View {
PlaceSearchView(
orientation: .horizontal, // default is vertical
request: $placeSearchViewRequest,
configuration: configuration
)
.onLoad { places in
print("places: \(places)")
}
.onRequestError { error in
print("error: \(error)")
}
.onPlaceSelected { place in
print("place: \(place)")
}
}
}
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2025-08-31(UTC)
[null,null,["최종 업데이트: 2025-08-31(UTC)"],[],[],null,["Select platform: [Android](/maps/documentation/places/android-sdk/place-search-ui-kit \"View this page for the Android platform docs.\") [iOS](/maps/documentation/places/ios-sdk/place-search-ui-kit \"View this page for the iOS platform docs.\") [JavaScript](/maps/documentation/javascript/places-ui-kit/place-list \"View this page for the JavaScript platform docs.\")\n\n\u003cbr /\u003e\n\nPlace Search component\n======================\n\n\nThe Place Search component of the Places UI Kit renders the results of a place search in a list.\n\n\nYou can customize the Place Search list. You can specify:\n\n- The content to display\n- Media size in vertical orientation\n- Text truncation\n- The orientation\n- Theme overrides that match your brand and app's design language\n- The position of the attribution\n- Whether a place is selectable\n\n\nYou can also customize the request to perform either a [`Search by text request`](/maps/documentation/places/ios-sdk/reference/swift/Structs/SearchByTextRequest) or a [`Search Nearby request`](/maps/documentation/places/ios-sdk/reference/swift/Structs/SearchNearbyRequest).\n\nBilling\n-------\n\n\nYou are billed each time the `SearchByTextRequest()` or `PlaceSearchViewRequest()` binding value is changed.\n\nAdd Place Search to your app\n----------------------------\n\n| **Tip:** [See the complete example](/maps/documentation/places/ios-sdk/place-search-ui-kit#example).\n\n\nAdd the Place Search widget using the `PlaceSearchView class`. \n\n### Swift\n\n```swift\nPlaceSearchView(\n orientation: .horizontal, // default is vertical\n request: $placeSearchViewRequest,\n configuration: configuration\n)\n```\n\n\nWhen you want your app to load a text search or nearby search result, update your `PlaceSearchViewRequest` value. \n\n### Swift\n\n```swift\n// use placeSearchViewRequest = .searchNearby(...) to configure a searchNearby request\n\n @State private var let placeSearchViewRequest = .searchByText(\n SearchByTextRequest(\n textQuery: \"Googleplex\",\n placeProperties: [.all],\n locationBias: CircularCoordinateRegion(\n center: CLLocationCoordinate2D(latitude: 0, longitude: 0),\n radius: 0\n )\n )\n )\n \n```\n\n\nYou can also optionally receive callbacks when the component loads, a place is selected, or when there is an error loading the component. \n\n### Swift\n\n```swift\n.onLoad { places in\n print(\"places: \\(places)\")\n}\n.onRequestError { error in\n print(\"error: \\(error)\")\n}\n.onPlaceSelected { place in\n print(\"place: \\(place)\")\n}\n \n```\n\nCustomize the Place Search component\n------------------------------------\n\n### Customize content\n\nYou must specify which content your component will display. **Note:** The Place name will always appear.\n\n\nThis example configures the component to display the address and rating of the Place. \n\n### Swift\n\n```swift\nprivate let configuration = PlaceSearchConfiguration(\n content: [.address(), .rating()]\n)\n```\n\n\nYou can also optionally customize the following aspects of the content that appears in your Place Search component:\n\n- [`content`](/maps/documentation/places/ios-sdk/reference/swift/Enums/PlaceSearchContent): The content shown in the component.\n- [`mediaSize`](/maps/documentation/places/ios-sdk/reference/swift/Enums/PlaceSearchContent#mediasize:): The photo size in the vertical orientation of the fragment. The default is small. Specified in content.\n- [`preferTruncation`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlaceSearchConfiguration#prefertruncation): Whether to truncate text of each Place Details view. The default is false.\n- [`theme`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlaceSearchConfiguration#theme): Your custom theme that inherits from PlacesMaterialTheme. Learn more about theming.\n- [`attributionPosition`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlaceSearchConfiguration#attributionposition): Whether to show the Google Maps attribution at the top or bottom of the component. The default is .top.\n- [`selectable`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlaceSearchConfiguration#selectable): Whether each place in the list is selectable. If it is selectable, `onPlaceSelected` closure will be called after a place is selected. The default is false.\n\n\nAdd your customization configuration to [`PlaceSearchConfiguration`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlaceSearchConfiguration). \n\n### Swift\n\n```swift\nprivate let configuration = PlaceSearchConfiguration(\n content: [.address, .rating, .media(size: .large)],\n preferTruncation: true, // default is false\n theme: PlacesMaterialTheme(),\n attributionPosition: .bottom, // default is top\n selectable: true // default is false\n)\n \n```\n\n### Customize orientation\n\n\nThe default orientation is vertical. You can specify a horizontal orientation in `PlaceSearchView`. \n\n### Swift\n\n```swift\nPlaceSearchView(\n orientation: .horizontal, // default is vertical\n request: $placeSearchViewRequest,\n configuration: configuration\n)\n \n```\n\n### Customize the theme\n\n\nYou can specify a theme that overrides any of the default style attributes. The default is [`PlacesMaterialTheme`](/maps/documentation/places/ios-sdk/reference/swift/Structs/PlacesMaterialTheme). See the [Place Details component documentation](/maps/documentation/places/ios-sdk/place-details-ui-kit#customize-place-details) for more information on theming. \n\n### Swift\n\n```swift\n@Environment(\\.colorScheme) var colorScheme\nvar theme: PlacesMaterialTheme {\n if customTheme {\n var theme = PlacesMaterialTheme()\n var color = PlacesMaterialColor()\n color.surface = (colorScheme == .dark ? .blue : .gray)\n color.outlineDecorative = (colorScheme == .dark ? .white : .black)\n color.onSurface = (colorScheme == .dark ? .yellow : .red)\n color.onSurfaceVariant = (colorScheme == .dark ? .white : .blue)\n color.onSecondaryContainer = (colorScheme == .dark ? .white : .red)\n color.secondaryContainer = (colorScheme == .dark ? .green : .purple)\n color.positive = (colorScheme == .dark ? .yellow : .red)\n color.primary = (colorScheme == .dark ? .yellow : .purple)\n color.info = (colorScheme == .dark ? .yellow : .purple)\n var shape = PlacesMaterialShape()\n shape.cornerRadius = 10\n var font = PlacesMaterialFont()\n font.labelLarge = .system(size: UIFontMetrics.default.scaledValue(for: 18))\n font.headlineMedium = .system(size: UIFontMetrics.default.scaledValue(for: 15))\n font.bodyLarge = .system(size: UIFontMetrics.default.scaledValue(for: 15))\n font.bodyMedium = .system(size: UIFontMetrics.default.scaledValue(for: 12))\n font.bodySmall = .system(size: UIFontMetrics.default.scaledValue(for: 11))\n var attribution = PlacesMaterialAttribution()\n attribution.lightModeColor = .black\n attribution.darkModeColor = .white\n theme.color = color\n theme.shape = shape\n theme.font = font\n theme.attribution = attribution\n } else {\n return PlacesMaterialTheme()\n }\n}\n \n```\n\nExample\n-------\n\n### Swift\n\n```swift\nstruct PlaceSearchDemoView: View {\n private let configuration = PlaceSearchConfiguration(\n content: [.address(), .rating(), .type(), .media(size: .large)],\n preferTruncation: true, // default is false\n theme: PlacesMaterialTheme(),\n attributionPosition: .bottom, // default is top\n selectable: true // default is false\n )\n // can also do let placeSearchViewRequest = .searchNearby(...) to configure a searchNearby request\n @State private var placeSearchViewRequest: PlaceSearchViewRequest = .searchByText(\n SearchByTextRequest(\n textQuery: \"Googleplex\",\n placeProperties: [.all],\n locationBias: CircularCoordinateRegion(\n center: CLLocationCoordinate2D(latitude: 0, longitude: 0),\n radius: 0\n )\n )\n )\n var body: some View {\n PlaceSearchView(\n orientation: .horizontal, // default is vertical\n request: $placeSearchViewRequest,\n configuration: configuration\n )\n .onLoad { places in\n print(\"places: \\(places)\")\n }\n .onRequestError { error in\n print(\"error: \\(error)\")\n }\n .onPlaceSelected { place in\n print(\"place: \\(place)\")\n }\n }\n}\n \n```"]]