
نشانگرها مکان های منفرد را روی نقشه نشان می دهند.
به طور پیشفرض، نشانگرها از یک نماد استاندارد استفاده میکنند که ظاهر و احساس رایج Google Maps را دارد. اگر میخواهید نشانگر خود را سفارشی کنید، میتوانید رنگ نشانگر پیشفرض را تغییر دهید، یا تصویر نشانگر را با یک نماد سفارشی جایگزین کنید، یا سایر ویژگیهای نشانگر را تغییر دهید.
در پاسخ به رویداد کلیک روی یک نشانگر، میتوانید پنجره اطلاعات را باز کنید. یک پنجره اطلاعات متن یا تصاویر را در یک پنجره گفتگوی بالای نشانگر نمایش می دهد. میتوانید از یک پنجره اطلاعات پیشفرض برای نمایش متن استفاده کنید، یا پنجره اطلاعات سفارشی خود را برای کنترل کامل محتوای آن ایجاد کنید.
اضافه کردن نشانگر
برای افزودن یک نشانگر، یک شی GMSMarker ایجاد کنید که شامل position و title باشد و map آن را تنظیم کنید.
مثال زیر نحوه اضافه کردن نشانگر به یک شی GMSMapView موجود را نشان می دهد. نشانگر در مختصات 10,10 ایجاد می شود و رشته "Hello world" را در پنجره اطلاعات با کلیک روی آن نمایش می دهد.
سویفت
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.title = "Hello World" marker.map = mapView
هدف-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.title = @"Hello World"; marker.map = mapView;
میتوانید با تنظیم ویژگی marker.appearAnimation اضافه شدن نشانگرهای جدید به نقشه را متحرک کنید:
-
kGMSMarkerAnimationPopباعث می شود که نشانگر هنگام اضافه شدن ازgroundAnchorخود خارج شود. -
kGMSMarkerAnimationFadeInباعث می شود که نشانگر در هنگام اضافه شدن محو شود.
حذف یک نشانگر
با تنظیم ویژگی map GMSMarker بر روی nil ، می توانید یک نشانگر را از نقشه حذف کنید. از طرف دیگر، میتوانید با فراخوانی روش clear GMSMapView ، همه پوششها (از جمله نشانگرها) را که در حال حاضر روی نقشه هستند حذف کنید.
سویفت
let camera = GMSCameraPosition.camera( withLatitude: -33.8683, longitude: 151.2086, zoom: 6 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) // ... mapView.clear()
هدف-C
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; // ... [mapView clear];
اگر میخواهید پس از افزودن نشانگر به نقشه، تغییراتی در آن ایجاد کنید، مطمئن شوید که شی GMSMarker را نگه دارید. بعداً میتوانید با ایجاد تغییرات در این شی، نشانگر را تغییر دهید.
سویفت
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.map = mapView // ... marker.map = nil
هدف-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.map = mapView; // ... marker.map = nil;
تغییر رنگ نشانگر
میتوانید رنگ تصویر نشانگر پیشفرض را با درخواست یک نسخه رنگی از نماد پیشفرض با markerImageWithColor: و ارسال تصویر بهدستآمده به ویژگی نماد GMSMarker سفارشی کنید.
سویفت
marker.icon = GMSMarker.markerImage(with: .black)
هدف-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
سفارشی کردن تصویر نشانگر
اگر میخواهید تصویر نشانگر پیشفرض را تغییر دهید، میتوانید با استفاده از icon نشانگر یا ویژگی iconView یک نماد سفارشی تنظیم کنید. اگر iconView تنظیم شده باشد، API ویژگی icon را نادیده می گیرد.
با استفاده از ویژگی icon نشانگر
قطعه زیر یک نشانگر با یک نماد سفارشی ارائه شده به عنوان UIImage در ویژگی icon ایجاد می کند. این نماد در لندن، انگلستان قرار دارد. این قطعه فرض می کند که برنامه شما حاوی تصویری به نام "house.png" است.
سویفت
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let london = GMSMarker(position: positionLondon) london.title = "London" london.icon = UIImage(named: "house") london.map = mapView
هدف-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *london = [GMSMarker markerWithPosition:positionLondon]; london.title = @"London"; london.icon = [UIImage imageNamed:@"house"]; london.map = mapView;
اگر چندین نشانگر با یک تصویر ایجاد می کنید، از نمونه مشابهی از UIImage برای هر یک از نشانگرها استفاده کنید. این به بهبود عملکرد برنامه شما در هنگام نمایش بسیاری از نشانگرها کمک می کند.
این تصویر ممکن است چندین فریم داشته باشد. علاوه بر این، ویژگی alignmentRectInsets رعایت می شود، که در صورتی مفید است که نشانگر دارای یک سایه یا منطقه غیرقابل استفاده باشد.
با استفاده از ویژگی iconView نشانگر
قطعه زیر با تنظیم ویژگی iconView نشانگر یک نشانگر با یک نماد سفارشی ایجاد می کند و تغییر رنگ نشانگر را متحرک می کند. این قطعه فرض می کند که برنامه شما حاوی تصویری به نام "house.png" است.
سویفت
import CoreLocation import GoogleMaps class MarkerViewController: UIViewController, GMSMapViewDelegate { var mapView: GMSMapView! var london: GMSMarker? var londonView: UIImageView? override func viewDidLoad() { super.viewDidLoad() let camera = GMSCameraPosition.camera( withLatitude: 51.5, longitude: -0.127, zoom: 14 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) view = mapView mapView.delegate = self let house = UIImage(named: "House")!.withRenderingMode(.alwaysTemplate) let markerView = UIImageView(image: house) markerView.tintColor = .red londonView = markerView let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let marker = GMSMarker(position: position) marker.title = "London" marker.iconView = markerView marker.tracksViewChanges = true marker.map = mapView london = marker } func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { UIView.animate(withDuration: 5.0, animations: { () -> Void in self.londonView?.tintColor = .blue }, completion: {(finished) in // Stop tracking view changes to allow CPU to idle. self.london?.tracksViewChanges = false }) } }
هدف-C
@import CoreLocation; @import GoogleMaps; @interface MarkerViewController : UIViewController <GMSMapViewDelegate> @property (strong, nonatomic) GMSMapView *mapView; @end @implementation MarkerViewController { GMSMarker *_london; UIImageView *_londonView; } - (void)viewDidLoad { [super viewDidLoad]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5 longitude:-0.127 zoom:14]; _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; self.view = _mapView; _mapView.delegate = self; UIImage *house = [UIImage imageNamed:@"House"]; house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; _londonView = [[UIImageView alloc] initWithImage:house]; _londonView.tintColor = [UIColor redColor]; CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127); _london = [GMSMarker markerWithPosition:position]; _london.title = @"London"; _london.iconView = _londonView; _london.tracksViewChanges = YES; _london.map = self.mapView; } - (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { [UIView animateWithDuration:5.0 animations:^{ self->_londonView.tintColor = [UIColor blueColor]; } completion:^(BOOL finished) { // Stop tracking view changes to allow CPU to idle. self->_london.tracksViewChanges = NO; }]; } @end
از آنجایی که iconView یک UIView را میپذیرد، میتوانید سلسله مراتبی از کنترلهای استاندارد UI داشته باشید که نشانگرهای شما را تعریف میکنند، هر نما دارای مجموعه استانداردی از قابلیتهای انیمیشن است. میتوانید تغییراتی در اندازه نشانگر، رنگ و سطوح آلفا و همچنین اعمال تبدیلهای دلخواه اعمال کنید. ویژگی iconView از انیمیشن تمام ویژگیهای متحرک UIView به جز frame و center پشتیبانی میکند.
لطفاً هنگام استفاده از iconView به نکات زیر توجه کنید:
- زمانی که
tracksViewChangesرویYESتنظیم شده باشد،UIViewمیتواند منابع زیادی را طلب کند، که ممکن است منجر به افزایش مصرف باتری شود. در مقایسه،UIImageیک فریم ثابت است و نیازی به رندر مجدد ندارد. - اگر نشانگرهای زیادی روی صفحه دارید و هر نشانگر
UIViewخاص خود را دارد و همه نشانگرها همزمان تغییرات را ردیابی میکنند، ممکن است برخی دستگاهها برای ارائه نقشه مشکل داشته باشند. - یک
iconViewبه تعامل کاربر پاسخ نمی دهد، زیرا یک عکس فوری از نما است. - نمایش به گونهای عمل میکند که گویی
clipsToBoundsبدون توجه به مقدار واقعی آن رویYESتنظیم شده است. میتوانید تبدیلهایی را اعمال کنید که خارج از محدوده کار میکنند، اما شیئی که ترسیم میکنید باید در محدوده شیء باشد. همه تبدیل ها/تغییرها نظارت و اعمال می شوند. به طور خلاصه: بازدیدهای فرعی باید در نما باشد. - برای استفاده از
-copyWithZone:درGMSMarker، ابتدا بایدGMSMarkerرا کپی کنید و سپس یک نمونه جدید ازiconViewرا روی کپی تنظیم کنید.UIViewازNSCopyingپشتیبانی نمی کند، بنابراین نمی تواندiconViewکپی کند.
برای تصمیم گیری در مورد زمان تنظیم ویژگی tracksViewChanges ، باید ملاحظات عملکرد را در مقابل مزایای ترسیم مجدد خودکار نشانگر بسنجید. به عنوان مثال:
- اگر یک سری تغییرات برای ایجاد دارید، می توانید ویژگی را به
YESتغییر دهید و سپس بهNOبرگردید. - هنگامی که یک انیمیشن در حال اجرا است یا محتویات به صورت ناهمزمان بارگذاری می شوند، باید ویژگی را روی
YESتنظیم کنید تا زمانی که اقدامات کامل شوند.
تغییر شفافیت نشانگر
شما می توانید کدورت یک نشانگر را با خاصیت opacity آن کنترل کنید. شما باید کدورت را به عنوان یک شناور بین 0.0 و 1.0 مشخص کنید، جایی که 0 کاملاً شفاف و 1 کاملاً مات است.
سویفت
marker.opacity = 0.6
هدف-C
marker.opacity = 0.6;
میتوانید کدورت نشانگر را با Core Animation با استفاده از GMSMarkerLayer متحرک کنید.
صاف کردن یک نشانگر
نمادهای نشانگر معمولاً بهجای سطح نقشه در جهت روی صفحه دستگاه ترسیم میشوند، بنابراین چرخش، کج کردن یا بزرگنمایی نقشه لزوماً جهت نشانگر را تغییر نمیدهد.
می توانید جهت یک نشانگر را به صورت صاف در برابر زمین تنظیم کنید. نشانگرهای مسطح زمانی که نقشه می چرخد می چرخند و وقتی نقشه کج می شود چشم انداز را تغییر می دهند. مانند نشانگرهای معمولی، نشانگرهای مسطح هنگام بزرگنمایی یا کوچکنمایی نقشه، اندازه خود را حفظ می کنند.
برای تغییر جهت نشانگر، ویژگی flat نشانگر را روی YES یا true تنظیم کنید.
سویفت
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let londonMarker = GMSMarker(position: positionLondon) londonMarker.isFlat = true londonMarker.map = mapView
هدف-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon]; londonMarker.flat = YES; londonMarker.map = mapView;
چرخاندن یک نشانگر
با تنظیم ویژگی rotation ، می توانید یک نشانگر را در اطراف نقطه لنگر آن بچرخانید. چرخش را بهعنوان یک نوع CLLocationDegrees تعیین کنید، که در جهت عقربههای ساعت از موقعیت پیشفرض اندازهگیری میشود. هنگامی که نشانگر روی نقشه صاف است، موقعیت پیش فرض شمال است.
مثال زیر نشانگر را 90 درجه می چرخاند. تنظیم ویژگی groundAnchor روی 0.5,0.5 باعث می شود که نشانگر به جای پایه خود به دور مرکز خود بچرخد.
سویفت
let degrees = 90.0 londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5) londonMarker.rotation = degrees londonMarker.map = mapView
هدف-C
CLLocationDegrees degrees = 90; londonMarker.groundAnchor = CGPointMake(0.5, 0.5); londonMarker.rotation = degrees; londonMarker.map = mapView;
مدیریت رویدادها روی نشانگرها
می توانید به رویدادهایی که روی نقشه رخ می دهند گوش دهید، مانند زمانی که کاربر روی یک نشانگر ضربه می زند. برای گوش دادن به رویدادها، باید پروتکل GMSMapViewDelegate پیاده سازی کنید. برای یادگیری نحوه مدیریت رویدادهای نشانگر خاص ، رویدادها و حرکات نشانگر را ببینید. راهنمای رویدادها همچنین فهرستی از روشها را در GMSMapViewDelegate ارائه میکند. برای رویدادهای نمای خیابان، GMSPanoramaViewDelegate ببینید.