אירועים

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