الأحداث

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

باستخدام SDK للخرائط في نظام التشغيل 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];
}
      

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

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

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

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

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