نشانگرها مکانهای تکی را روی نقشه نشان میدهند.
به طور پیشفرض، نشانگرها از یک آیکون استاندارد استفاده میکنند که ظاهر و حس رایج نقشههای گوگل را دارد. اگر میخواهید نشانگر خود را سفارشی کنید، میتوانید رنگ نشانگر پیشفرض را تغییر دهید، یا تصویر نشانگر را با یک آیکون سفارشی جایگزین کنید، یا سایر ویژگیهای نشانگر را تغییر دهید.
در پاسخ به رویداد کلیک روی یک نشانگر، میتوانید یک پنجره اطلاعات باز کنید. یک پنجره اطلاعات، متن یا تصاویر را در یک پنجره محاورهای بالای نشانگر نمایش میدهد. میتوانید از یک پنجره اطلاعات پیشفرض برای نمایش متن استفاده کنید، یا پنجره اطلاعات سفارشی خود را ایجاد کنید تا محتوای آن را به طور کامل کنترل کنید.
اضافه کردن نشانگر
برای افزودن یک نشانگر، یک شیء 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
هدف-سی
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.title = @"Hello World"; marker.map = mapView;
شما میتوانید با تنظیم ویژگی marker.appearAnimation به صورت زیر، افزودن نشانگرهای جدید به نقشه را متحرکسازی کنید:
- برای اینکه نشانگر هنگام اضافه شدن از
groundAnchorخود بیرون بزند،kGMSMarkerAnimationPopکنید. - برای اینکه نشانگر هنگام اضافه شدن، محو شود،
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()
هدف-سی
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
هدف-سی
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.map = mapView; // ... marker.map = nil;
تغییر رنگ نشانگر
میتوانید رنگ تصویر نشانگر پیشفرض را با درخواست یک نسخه رنگی از آیکون پیشفرض با استفاده از markerImageWithColor: و ارسال تصویر حاصل به ویژگی icon در GMSMarker ، سفارشی کنید.
سویفت
marker.icon = GMSMarker.markerImage(with: .black)
هدف-سی
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
هدف-سی
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 }) } }
هدف-سی
@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 را میپذیرد، میتوانید سلسله مراتبی از کنترلهای رابط کاربری استاندارد داشته باشید که نشانگرهای شما را تعریف میکنند و هر نما دارای مجموعهای استاندارد از قابلیتهای انیمیشن است. میتوانید تغییراتی در اندازه، رنگ و سطح آلفای نشانگر و همچنین اعمال تبدیلهای دلخواه ایجاد کنید. ویژگی iconView از انیمیشن تمام ویژگیهای قابل انیمیشن UIView به جز frame و center پشتیبانی میکند.
لطفا هنگام استفاده از iconView به نکات زیر توجه کنید:
- وقتی
tracksViewChangesرویYESتنظیم شده باشد،UIViewمیتواند منابع زیادی را مصرف کند که ممکن است منجر به افزایش مصرف باتری شود. در مقابل، یکUIImageتک فریمی ایستا است و نیازی به رندر مجدد ندارد. - اگر نشانگرهای زیادی روی صفحه داشته باشید و هر نشانگر
UIViewمخصوص به خود را داشته باشد و همه نشانگرها همزمان تغییرات را ردیابی کنند، ممکن است برخی از دستگاهها در رندر کردن نقشه با مشکل مواجه شوند. - یک
iconViewبه تعامل کاربر پاسخ نمیدهد، زیرا تصویری از view است. - این نما طوری رفتار میکند که انگار
clipsToBoundsرویYESتنظیم شده است، صرف نظر از مقدار واقعی آن. میتوانید تبدیلهایی را اعمال کنید که خارج از محدودهها کار میکنند، اما شیئی که ترسیم میکنید باید درون محدودههای شی باشد. همه تبدیلها/تغییرات نظارت و اعمال میشوند. به طور خلاصه: زیرنماها باید درون نما قرار گیرند. - برای استفاده از
-copyWithZone:درGMSMarker، ابتدا بایدGMSMarkerرا کپی کنید و سپس یک نمونه جدید ازiconViewرا روی کپی تنظیم کنید.UIViewازNSCopyingپشتیبانی نمیکند، بنابراین نمیتواندiconViewرا کپی کند.
برای تصمیمگیری در مورد زمان تنظیم ویژگی tracksViewChanges ، باید ملاحظات مربوط به عملکرد را در مقابل مزایای ترسیم خودکار نشانگر، بسنجید. برای مثال:
- اگر میخواهید یک سری تغییرات ایجاد کنید، میتوانید ویژگی را به
YESتغییر دهید و سپس دوباره بهNOبرگردانید. - وقتی یک انیمیشن در حال اجرا است یا محتویات به صورت غیرهمزمان بارگذاری میشوند، باید تا زمان تکمیل عملیات، مقدار ویژگی را روی
YESنگه دارید.
تغییر میزان شفافیت نشانگر
شما میتوانید میزان شفافیت یک نشانگر را با استفاده از ویژگی opacity آن کنترل کنید. باید میزان شفافیت را به صورت اعشاری بین 0.0 و 1.0 تعیین کنید، که در آن 0 کاملاً شفاف و 1 کاملاً مات است.
سویفت
marker.opacity = 0.6
هدف-سی
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
هدف-سی
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon]; londonMarker.flat = YES; londonMarker.map = mapView;
چرخاندن یک نشانگر
شما میتوانید با تنظیم ویژگی rotation ، یک نشانگر را حول نقطه لنگر آن بچرخانید. چرخش را از نوع CLLocationDegrees تعیین کنید که بر حسب درجه در جهت عقربههای ساعت از موقعیت پیشفرض اندازهگیری میشود. وقتی نشانگر روی نقشه صاف است، موقعیت پیشفرض شمال است.
مثال زیر نشانگر را ۹۰ درجه میچرخاند. تنظیم ویژگی groundAnchor با 0.5,0.5 باعث میشود نشانگر به جای چرخش حول پایه، حول مرکز خود بچرخد.
سویفت
let degrees = 90.0 londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5) londonMarker.rotation = degrees londonMarker.map = mapView
هدف-سی
CLLocationDegrees degrees = 90; londonMarker.groundAnchor = CGPointMake(0.5, 0.5); londonMarker.rotation = degrees; londonMarker.map = mapView;
مدیریت رویدادها روی نشانگرها
شما میتوانید به رویدادهایی که روی نقشه رخ میدهند، مانند زمانی که کاربر روی یک نشانگر ضربه میزند، گوش دهید. برای گوش دادن به رویدادها، باید پروتکل GMSMapViewDelegate را پیادهسازی کنید. برای یادگیری نحوه مدیریت رویدادهای خاص نشانگر، به بخش رویدادها و حرکات نشانگر مراجعه کنید. راهنمای رویدادها همچنین لیستی از متدهای GMSMapViewDelegate را ارائه میدهد. برای رویدادهای نمای خیابان، به GMSPanoramaViewDelegate مراجعه کنید.