הרכיב Place Markers (סמני מקומות)
רכיב סמני המקומות מאפשר לכם ליצור הערות מותאמות אישית במפה שמציגות מידע מרכזי על המקום ישירות במפה. אתם יכולים להציג תוכן כמו דירוג של מקום, סוג המקום, סטטוס הפתיחה או הסגירה, טווח המחירים או טקסט מותאם אישית (לדוגמה, תווית שנוצרה על ידי AI או מספר מסלול). כך המשתמשים יכולים לקבל מידע רב יותר על המפה בלי ללחוץ על כרטיס מקום מפורט.
אפשר להציג סמל אחד של סמן וטקסט אופציונלי של סמן לכל PlaceMarker.
הסמלים הזמינים הם:
-
type: סוג המקום. -
none: אין סמל.
-
rating: ניקוד הדירוג. -
priceRange: טווח מחירים (לדוגמה, $10-20). -
openStatus: האם העסק פתוח או סגור. -
custom: טקסט בהתאמה אישית (לדוגמה, 'פופולרי').
מפנים למקום באמצעות מזהה מקום (.placeID), שם משאב (.resourceName) או קואורדינטות גיאוגרפיות (.coordinate).
דרישות לגבי הצגה ושיוך
כשסמני המפה של ערכת ממשק המשתמש של Places מוצגים, הם לא יכולים להופיע בנפרד. הם צריכים להיות אינטראקטיביים, וכשלוחצים עליהם או מקישים עליהם הם צריכים לפתוח רכיב משויך של פרטי מקום או חלון קופץ כדי לספק את המיתוג הנדרש של Google, את השיוך לתורם ואת תהליכי העבודה של 'דיווח על בעיה'.
במקרים שבהם יש מגבלות מקום, אפשר לעיין בדרישות שלנו לגבי שיוך תמונות וביקורות.
דוגמאות לשימוש ב-Place Marker
התאמה אישית בסיסית של סמנים
בדוגמה הבאה לקוד אפשר לראות התאמות אישיות בסיסיות של סמני מיקום.
Swift
import GooglePlacesSwift import SwiftUI @MainActor struct DefaultMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.placeID("PLACE_ID"), markerIcon: .none ) } } @MainActor struct RatingMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.placeID("PLACE_ID"), markerIcon: .none, markerText: .rating ) } } @MainActor struct TypeAndRatingMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.placeID("PLACE_ID"), markerIcon: .type, markerText: .rating ) } } @MainActor struct PriceRangeMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.resourceName("places/PLACE_RESOURCE_NAME"), markerIcon: .none, markerType: .priceRange ) } } @MainActor struct OpenStatusMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.coordinate(CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)), markerIcon: .icon, markerText: .openStatus ) } } @MainActor struct PhotoMarker: View { PlaceMarker( identifier: PlaceIdentifier.resourceName("places/PLACE_RESOURCE_NAME") markerIcon =.Photo ) } @MainActor struct CustomMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.placeID("PLACE_ID"), markerIcon: .none, markerType: .custom(label: "3") ) } }
התאמה אישית של מראה הסמן
בדוגמת הקוד הבאה אפשר לראות איך משתמשים במגדירי תצוגה מוצהרים של SwiftUI כדי להתאים אישית את המראה של סמן. בדוגמה הזו, מסתירים את החלק המשולש של בועת הדיבור ומספקים קריאה חוזרת להקשה כדי להפעיל פעולות מותאמות אישית באפליקציה כשהמשתמש מקיש על הסמן.
Swift
@MainActor struct ModifierStyleMarker: View { var body: some View { PlaceMarker( identifier: .placeID("PLACE_ID"), markerIcon: .none, markerText: .openStatus, configuration: PlaceMarkerConfiguration(beakPresence: false) ) .onTap { placeID in print("Marker tapped for place: \(placeID)") } } }
טיפול בשיחות חוזרות
בדוגמת הקוד הבאה מוצג אופן השימוש בפונקציות קריאה חוזרת (callback) כדי לטפל בשגיאות שקשורות לעיבוד מוצלח או לנתונים חסרים.
Swift
import GooglePlacesSwift import SwiftUI @MainActor struct StatusHandlingMarker: View { var body: some View { PlaceMarker( identifier: PlaceIdentifier.placeID("PLACE_ID"), markerIcon: .none markerText: .priceRange, ) /// Triggered when place data is successfully fetched or when data fetching fails or /// required data is missing for the place.. .onLoad { result in if let place = result.place { print("Marker successfully loaded for place ID: \(place.placeID)") } else if let error = result.error { print("Failed to load marker: \(error)") } } } }
שילוב עם Maps SDK
בדוגמת הקוד הבאה אפשר לראות איך מטמיעים את PlaceMarker ב-SDK של מפות ל-iOS GMSMarker באמצעות מחלקת העזר PlaceMarkerHostingView כדי לעטוף את PlaceMarker.
Swift
import GoogleMaps import GooglePlacesSwift import SwiftUI import UIKit func addPlaceMarker(to mapView: GMSMapView, placeID: String) { let marker = GMSMarker() let markerView = PlaceMarker( identifier: .placeID(placeID), markerType: .rating(showIcon: true), ).onLoad { result in switch Result case .success(let place) marker.position = place.coordinate case .error(let error) { print("Failed to load marker: \(error)") } } marker.iconView = PlaceMakerHostingView(markerView) marker.map = mapView }