رویداد

پلاتفرم را انتخاب کنید: Android iOS JavaScript

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

مقدمه

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

Swift

import GoogleMaps

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

آبجکتیو-سی

@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 options = GMSMapViewOptions()
  options.camera = camera
  let mapView = GMSMapView(options: options)
  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];
  GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
  options.camera = camera;
  GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];
  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
      }
    }
  }
      

آبجکتیو-سی

static 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، راهنمای مرجع را ببینید.