باستخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط 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]; }
أحداث تتعلّق بالأنشطة التجارية ونقاط الاهتمام الأخرى
بشكل افتراضي، تظهر نقاط الاهتمام (POIs) على الخريطة الأساسية مع الرموز المقابلة لها. تشمل نقاط الاهتمام المنتزهات والمدارس والمباني الحكومية وغيرها، بالإضافة إلى نقاط الاهتمام للأنشطة التجارية مثل المتاجر والمطاعم والفنادق.
يمكنك الرد على أحداث النقر في نقطة اهتمام. اطّلع على دليل الأنشطة التجارية ونقاط الاهتمام الأخرى.
الأحداث الأخرى
للحصول على معلومات حول القائمة الكاملة للطُرق على GMSMapViewDelegate
، يمكنك مراجعة
الدليل المرجعي.