الأحداث

اختَر النظام الأساسي: 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 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، يمكنك الاطّلاع على الدليل المرجعي.