الأحداث

اختيار النظام الأساسي: 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];
}
      

فعاليات حول الأنشطة التجارية ونقاط الاهتمام الأخرى

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

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

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

للاطّلاع على القائمة الكاملة للطرق على GMSMapViewDelegate، يمكنك الاطّلاع على الدليل المرجعي.