الأحداث

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