الأحداث

اختيار النظام الأساسي: Android‏ iOS‏ JavaScript‏

باستخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط 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 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)")
}
      

Objective-C

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

Objective-C

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

أحداث في المؤسسات ونقاط الاهتمام الأخرى

تظهر نقاط الاهتمام تلقائيًا على الخريطة الأساسية مع الرموز المقابلة لها. تشمل نقاط الاهتمام المتنزهات والمدارس والمباني الحكومية وغيرها، بالإضافة إلى نقاط الاهتمام التجارية، مثل المتاجر والمطاعم والفنادق.

يمكنك الردّ على الأحداث الناتجة عن النقر على نقطة اهتمام. اطّلِع على دليل الأنشطة التجارية ونقاط الاهتمام الأخرى.

الأحداث الأخرى

للاطّلاع على القائمة الكاملة للطرق المتاحة في GMSMapViewDelegate، يُرجى مراجعة الدليل المرجعي.