رویداد

پلتفرم مورد نظر را انتخاب کنید: اندروید، iOS، جاوا اسکریپت

با استفاده از Maps SDK برای iOS، می‌توانید به رویدادهایی که روی نقشه رخ می‌دهند، مانند رویدادهای تغییر دوربین یا رویدادهای ضربه زدن به نشانگر، گوش دهید.

مقدمه

برای گوش دادن به رویدادها، باید پروتکل GMSMapViewDelegate را پیاده‌سازی کنید. معمولاً این پروتکل را روی کنترلر نمای (view controller) که نقشه را نمایش می‌دهد، پیاده‌سازی می‌کنید. در زیر مثالی آورده شده است:

سویفت

import GoogleMaps

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

هدف-سی

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

وقتی GMSMapView ایجاد شد، می‌توانید نماینده آن را به کنترلر نمای خود تنظیم کنید. GMSMapViewDelegate فقط متدهای اختیاری ارائه می‌دهد. برای گوش دادن به هر رویداد خاص، باید متد مربوطه را پیاده‌سازی کنید.

سویفت

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)")
}
      

هدف-سی

- (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 ، مانند pan یا tilt، است. در غیر این صورت، NO نشان می‌دهد که این بخشی از یک تغییر برنامه‌ریزی شده است - برای مثال، از طریق روش‌هایی مانند animateToCameraPosition: یا به‌روزرسانی مستقیم لایه نقشه. همچنین اگر کاربر روی دکمه‌های My Location یا compass که انیمیشن‌هایی ایجاد می‌کنند که دوربین را تغییر می‌دهند، ضربه زده باشد، ممکن است NO باشد.

    این متد ممکن است چندین بار قبل از فراخوانی mapView:idleAtCameraPosition: فراخوانی شود، اگرچه این معمولاً فقط در صورتی اتفاق می‌افتد که انیمیشن‌ها و حرکات همزمان رخ دهند - برای مثال، یک حرکت، انیمیشن فعلی را لغو می‌کند و mapView:willMove: را برای بار دوم فراخوانی می‌کند.

  • mapView:didChangeCameraPosition: به طور مکرر در طول یک حرکت یا انیمیشن فراخوانی می‌شود، و همیشه پس از فراخوانی تابع mapView:willMove: است. موقعیت دوربین میانی به آن ارسال می‌شود.

  • در نهایت، mapView:idleAtCameraPosition: زمانی که موقعیت دوربین در GMSMapView غیرفعال می‌شود، فراخوانی می‌شود و موقعیت دوربین مربوطه را مشخص می‌کند. در این مرحله، تمام انیمیشن‌ها و حرکات متوقف شده‌اند.

    برنامه‌ها می‌توانند از این رویداد برای به‌روزرسانی نشانگرها یا سایر محتوای نمایش داده شده در GMSMapView استفاده کنند، به جای اینکه، برای مثال، محتوا را با هر تغییر دوربین مجدداً بارگذاری کنند.

برای مثال، یک برنامه می‌تواند GMSMapView را در حین حرکت پاک کند و سپس موقعیت قرارگیری دوربین را به صورت معکوس ژئوکدگذاری کند.

سویفت

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
      }
    }
  }
      

هدف-سی

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) به همراه آیکون‌های مربوطه‌شان روی نقشه پایه ظاهر می‌شوند. POIها شامل پارک‌ها، مدارس، ساختمان‌های دولتی و موارد دیگر و همچنین POIهای تجاری مانند مغازه‌ها، رستوران‌ها و هتل‌ها می‌شوند.

شما می‌توانید به رویدادهای کلیک روی یک POI پاسخ دهید. به راهنمای کسب و کارها و سایر نقاط مورد علاقه مراجعه کنید.

رویدادهای دیگر

برای آشنایی با فهرست کامل متدهای GMSMapViewDelegate ، به راهنمای مرجع مراجعه کنید.