באמצעות SDK של מפות Google ל-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 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
זמינה במדריך העזר.