באמצעות SDK של מפות ל-iOS, אפשר להאזין לאירועים שמתרחשים במפה, כמו אירועים של שינוי המצלמה או אירועים של הקשה על סמן.
מבוא
כדי להאזין לאירועים, צריך להטמיע את פרוטוקול GMSMapViewDelegate. בדרך כלל, מטמיעים את הפרוטוקול הזה בבקר התצוגה שמציג את המפה. לדוגמה:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
כשיוצרים את GMSMapView, אפשר להגדיר את הנציג שלו לבקר התצוגה. ה-GMSMapViewDelegate מספק רק שיטות אופציונליות. כדי להאזין לאירוע מסוים, צריך להטמיע את השיטה הרלוונטית.
Swift
override func loadView() { super.loadView() let camera = GMSCameraPosition.camera( withLatitude: 1.285, longitude: 103.848, zoom: 12 ) let options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) 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]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; 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
static 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]; }
אירועים בעסקים ובנקודות עניין אחרות
כברירת מחדל, נקודות עניין מופיעות במפת הבסיס עם הסמלים שלהן. נקודות עניין כוללות פארקים, בתי ספר, בנייני ממשלה ועוד, וגם נקודות עניין עסקיות כמו חנויות, מסעדות ומלונות.
אפשר להגיב לאירועי קליקים בנקודת עניין. כאן אפשר לקרוא את המדריך בנושא עסקים ונקודות עניין אחרות.
אירועים אחרים
רשימה מלאה של השיטות ב-GMSMapViewDelegate זמינה במדריך.