الأحداث

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