باستخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط 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، راجِع
الدليل المرجعي.