אירועים

בחירת פלטפורמה: Android iOS JavaScript

באמצעות ה-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 מציין שזה חלק משינוי פרוגרמטי - לדוגמה, באמצעות methods כמו 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 זמין כאן אל המדריך.