אירועים

בחירת פלטפורמה: 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.