באמצעות Maps SDK for iOS, אפשר להאזין לאירועים שמתרחשים במפה, כמו אירועים של שינוי המצלמה או אירועים של הקשה על סמן.
מבוא
כדי להאזין לאירועים, צריך להטמיע את הפרוטוקול GMSMapViewDelegate
. בדרך כלל, מטמיעים את הפרוטוקול הזה בבקר התצוגה שמציג את המפה. לדוגמה:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
אחרי שיוצרים את GMSMapView
, אפשר להגדיר את הנציג שלו כבקר התצוגה. ה-GMSMapViewDelegate
מספק רק שיטות אופציונליות. כדי להפעיל listener לאירוע מסוים, צריך להטמיע את ה-method הרלוונטי.
Swift
override func loadView() { super.loadView() let camera = GMSCameraPosition.camera( withLatitude: 1.285, longitude: 103.848, zoom: 12 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) mapView.delegate = self self.view = mapView } // MARK: GMSMapViewDelegate func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) { print("You tapped at \(coordinate.latitude), \(coordinate.longitude)") }
Objective-C
- (void)loadView { [super loadView]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285 longitude:103.848 zoom:12]; GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView.delegate = self; self.view = mapView; } #pragma mark - GMSMapViewDelegate - (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude); }
מיקום המצלמה
באמצעות GMSMapViewDelegate
, אפשר להאזין לשינויים במיקום המצלמה שמשמשת לעיבוד המפה. אלה שלושה אירועים שונים.
mapView:willMove:
מציין שהמיקום של המצלמה עומד להשתנות. אם הארגומנטgesture
מוגדר כ-YES
, הסיבה לכך היא שהמשתמש ביצע תנועה טבעית ב-GMSMapView
, כמו הזזה או הטיה. אחרת,NO
מציין שזה חלק משינוי פרוגרמטי – למשל, באמצעות שיטות כמוanimateToCameraPosition:
או עדכון השכבה של המפה ישירות. יכול להיות שזה גםNO
אם משתמש הקיש על הלחצנים 'המיקום שלי' או 'מצפן', שיוצרים אנימציות שמשנות את המצלמה.יכול להיות שהשיטה הזו תיקרא כמה פעמים לפני הפעלת
mapView:idleAtCameraPosition:
, אבל זה קורה בדרך כלל רק אם אנימציות ומחוות מתרחשות בו-זמנית – למשל, מחווה תבטל כל אנימציה נוכחית ותפעיל אתmapView:willMove:
בפעם השנייה.
mapView:didChangeCameraPosition:
נקראת שוב ושוב במהלך תנועה או אנימציה, תמיד אחרי קריאה ל-mapView:willMove:
. הוא מקבל את מיקום המצלמה הביניים.לבסוף, מתבצעת קריאה ל-
mapView:idleAtCameraPosition:
ברגע שהמצלמה ב-GMSMapView
עוברת למצב לא פעיל, והמיקום הרלוונטי של המצלמה מצוין. בשלב הזה, כל האנימציות והמחוות מפסיקות.אפליקציות יכולות להשתמש באירוע הזה כדי להפעיל רענון של סמנים או של תוכן אחר שמוצג ב
GMSMapView
, במקום, לדוגמה, לטעון מחדש את התוכן בכל שינוי במצלמה.
לדוגמה, אפליקציה יכולה לנקות את GMSMapView
בתנועה, ואז לבצע גיאו-קידוד הפוך של המיקום שבו המצלמה נעצרת.
Swift
let geocoder = GMSGeocoder() func mapView(_ mapView: GMSMapView, willMove gesture: Bool) { mapView.clear() } func mapView(_ mapView: GMSMapView, idleAt cameraPosition: GMSCameraPosition) { geocoder.reverseGeocodeCoordinate(cameraPosition.target) { (response, error) in guard error == nil else { return } if let result = response?.firstResult() { let marker = GMSMarker() marker.position = cameraPosition.target marker.title = result.lines?[0] marker.snippet = result.lines?[1] marker.map = mapView } } }
Objective-C
GMSGeocoder *geocoder; - (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture { [mapView clear]; } - (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)cameraPosition { id handler = ^(GMSReverseGeocodeResponse *response, NSError *error) { if (error != nil) { return; } GMSReverseGeocodeResult *result = response.firstResult; GMSMarker *marker = [GMSMarker markerWithPosition:cameraPosition.target]; marker.title = result.lines[0]; marker.snippet = result.lines[1]; marker.map = mapView; }; [geocoder reverseGeocodeCoordinate:cameraPosition.target completionHandler:handler]; }
אירועים בעסקים ובנקודות עניין אחרות
כברירת מחדל, נקודות עניין (POI) מופיעות במפת הבסיס יחד עם הסמלים המתאימים שלהן. נקודות העניין כוללות פארקים, בתי ספר, בנייני ממשלה ועוד, וגם נקודות עניין עסקיות כמו חנויות, מסעדות ומלונות.
אפשר להגיב לאירועי קליקים בנקודת עניין. מדריך לעסקים ולמקומות מעניינים אחרים
אירועים אחרים
לרשימה מלאה של השיטות ב-GMSMapViewDelegate
, אפשר לעיין במדריך העזר.