אירועים

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

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

מבוא

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

Swift

import GoogleMaps

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

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

אחרי שיוצרים את GMSMapView, אפשר להגדיר את הנציג שלו כבקר התצוגה. ה-GMSMapViewDelegate מספק רק שיטות אופציונליות. כדי להפעיל listener לאירוע מסוים, צריך להטמיע את ה-method הרלוונטי.

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, אפשר לעיין במדריך העזר.