אירועים

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

באמצעות Maps SDK ל-iOS, אפשר להאזין לאירועים שמתרחשים במפה, כמו אירועי שינוי מצלמה או אירועי הקשה על סמנים.

מבוא

כדי להאזין לאירועים, צריך להטמיע את הפרוטוקול GMSMapViewDelegate. בדרך כלל מטמיעים את הפרוטוקול הזה ב-view controller שמוצגת בו המפה. דוגמה:

Swift

import GoogleMaps

class Events: UIViewController, GMSMapViewDelegate {
  // ...
}
      

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

כשיוצרים את GMSMapView, אפשר להגדיר את הנציג שלו ל-view controller. ה-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.