بااستفاده از «کیت توسعه نرمافزار Maps برای iOS»، میتوانید به رویدادهایی که در نقشه رخ میدهد، مانند رویدادهای تغییر دوربین یا رویدادهای تکضرب زدن روی نشانگر، گوش دهید.
مقدمه
برای گوش دادن به رویدادها، باید پروتکل
GMSMapViewDelegate را پیادهسازی کنید. معمولاً این پروتکل را در کنترلکننده نمایی که نقشه را نمایش میدهد پیادهسازی میکنید. در زیر نمونهای آورده شده است:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
آبجکتیو-سی
@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 options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) mapView.delegate = self self.view = mapView } // MARK: GMSMapViewDelegate func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) { print("You tapped at \(coordinate.latitude), \(coordinate.longitude)") }
آبجکتیو-سی
- (void)loadView { [super loadView]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285 longitude:103.848 zoom:12]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; 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 } } }
آبجکتیو-سی
static 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]; }
رویدادهای کسبوکارها و دیگر نقاط جالب
بهطور پیشفرض، نقاط موردعلاقه (POI) بههمراه نمادهای مربوطهشان در نقشه مبنا نشان داده میشوند. نقاط موردعلاقه شامل پارکها، مدارس، ساختمانهای دولتی، و غیره، و همچنین نقاط موردعلاقه کسبوکار مانند فروشگاهها، رستورانها، و هتلها میشود.
میتوانید به رویدادهای کلیک روی نقطه موردعلاقه پاسخ دهید. راهنمای کسبوکارها و دیگر مکانهای جالب را ببینید.
رویدادهای دیگر
برای آشنایی با فهرست کامل روشها در GMSMapViewDelegate،
راهنمای مرجع را ببینید.