באמצעות ה-SDK של מפות ל-iOS, אתם יכולים להאזין לאירועים שמתרחשים במפה, כמו אירועים של שינוי מצלמה או אירועים של הקשה על סמן.
מבוא
כדי להאזין לאירועים, צריך להטמיע את הפרוטוקול GMSMapViewDelegate. בדרך כלל, מטמיעים את הפרוטוקול הזה ב-view controller שמציג את המפה. לדוגמה:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
אחרי שיוצרים את GMSMapView, אפשר להגדיר את ה-delegate שלו ל-view controller. ה-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 בזמן תנועה, ואז להמיר את הקואורדינטות לכתובת (reverse geocoding) במיקום שבו המצלמה נעצרת.
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.