الأحداث

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

باستخدام Maps SDK for 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: أو تعديل طبقة الخريطة مباشرةً. قد يحدث ذلك أيضًا إذا نقر المستخدم على زرَّي &quot;موقعي الجغرافي&quot; أو البوصلة، ما يؤدي إلى إنشاء صور متحركة تغيّر الكاميرا.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، راجِع الدليل المرجعي.