
تشير العلامات إلى مواقع جغرافية فردية على الخريطة.
تستخدم العلامات تلقائيًا رمزًا عاديًا يمنحها المظهر العام لتطبيق "خرائط Google". إذا أردت تخصيص علامتك، يمكنك تغيير لون العلامة التلقائية أو استبدال صورة العلامة برمز مخصّص أو تغيير خصائص أخرى للعلامة.
يمكنك فتح نافذة معلومات استجابةً لحدث ناتج عن النقر على علامة. تعرض نافذة المعلومات نصًا أو صورًا في نافذة حوار فوق العلامة. يمكنك استخدام نافذة معلومات تلقائية لعرض النص، أو إنشاء نافذة معلومات مخصّصة للتحكّم في محتواها بالكامل.
إضافة علامة
لإضافة علامة، أنشئ كائن
GMSMarker
يتضمّن position وtitle، واضبط map.
يوضّح المثال التالي كيفية إضافة علامة إلى كائن GMSMapView حالي. يتم إنشاء العلامة عند الإحداثيات 10,10، وتعرض السلسلة "Hello world" في نافذة معلومات عند النقر عليها.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.title = "Hello World" marker.map = mapView
Objective-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.
Swift
let camera = GMSCameraPosition.camera( withLatitude: -33.8683, longitude: 151.2086, zoom: 6 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) // ... mapView.clear()
Objective-C
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; // ... [mapView clear];
إذا أردت إجراء تعديلات على علامة بعد إضافتها إلى الخريطة، تأكَّد من الاحتفاظ بكائن GMSMarker. يمكنك تعديل العلامة لاحقًا من خلال إجراء تغييرات على هذا الكائن.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.map = mapView // ... marker.map = nil
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.map = mapView; // ... marker.map = nil;
تغيير لون العلامة
يمكنك تخصيص لون صورة العلامة التلقائية من خلال طلب نسخة ملوّنة من الرمز التلقائي باستخدام markerImageWithColor:، وتمرير الصورة الناتجة إلى السمة `icon` الخاصة بـ GMSMarker.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
تخصيص صورة العلامة
إذا أردت تغيير صورة العلامة التلقائية، يمكنك ضبط رمز مخصّص باستخدام
السمة icon أو iconView للعلامة. إذا تم ضبط iconView، تتجاهل واجهة برمجة التطبيقات
السمة icon.
استخدام السمة icon للعلامة
ينشئ المقتطف التالي علامة باستخدام رمز مخصّص يتم توفيره كـ UIImage في السمة icon. يتم توسيط الرمز في لندن، إنجلترا. يفترض المقتطف أنّ تطبيقك يحتوي على صورة باسم "house.png".
Swift
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
Objective-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".
Swift
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 }) } }
Objective-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، يمكنك إنشاء تسلسل هرمي لعناصر التحكّم في واجهة المستخدم العادية التي تحدّد علاماتك، مع حصول كل طريقة عرض على المجموعة العادية من إمكانات الحركة. يمكنك تضمين تغييرات في حجم العلامة ولونها ومستويات الشفافية، بالإضافة إلى تطبيق تحويلات عشوائية. تتيح السمة iconView تحريك جميع الخصائص القابلة للتحريك في UIView باستثناء frame وcenter.
يُرجى مراعاة النقاط التالية عند استخدام iconView:
- يمكن أن يكون
UIViewمتطلبًا للموارد عندما يتم ضبطtracksViewChangesعلىYES، ما قد يؤدي إلى زيادة استهلاك البطارية. في المقابل، تكونUIImageبإطار واحد ثابتة ولا تحتاج إلى إعادة عرضها. - قد تواجه بعض الأجهزة صعوبة في عرض الخريطة إذا كان لديك العديد من العلامات على الشاشة، وكان لكل علامة
UIViewخاصة بها، وكانت جميع العلامات تتتبّع التغييرات في الوقت نفسه. - لا تستجيب
iconViewلتفاعل المستخدم، لأنّها لقطة من طريقة العرض. - تتصرّف طريقة العرض كما لو تم ضبط
clipsToBoundsعلىYES، بغض النظر عن قيمتها الفعلية. يمكنك تطبيق تحويلات تعمل خارج الحدود، ولكن يجب أن يكون الكائن الذي ترسمه ضمن حدود الكائن. تتم مراقبة جميع التحويلات/عمليات النقل وتطبيقها. باختصار: يجب أن تكون طرق العرض الفرعية مضمّنة في طريقة العرض. - لاستخدام
-copyWithZone:علىGMSMarker، عليك نسخGMSMarkerأولاً ثم ضبط مثال جديد منiconViewعلى النسخة. لا تتيحUIViewاستخدامNSCopying، لذا لا يمكنها نسخiconView.
لتحديد وقت ضبط السمة tracksViewChanges، عليك مقارنة اعتبارات الأداء بمزايا إعادة رسم العلامة تلقائيًا. على سبيل المثال:
- إذا كان لديك سلسلة من التغييرات التي تريد إجراؤها، يمكنك تغيير السمة إلى
YESثم إعادتها إلىNO. - عندما يكون هناك حركة أو يتم تحميل المحتوى بشكل غير متزامن، عليك إبقاء السمة مضبوطة على
YESإلى أن تكتمل الإجراءات.
تغيير شفافية العلامة
يمكنك التحكّم في شفافية العلامة باستخدام السمة opacity. عليك تحديد الشفافية كقيمة عائمة بين 0.0 و1.0، حيث تكون 0 شفافة تمامًا و1 معتمة تمامًا.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
يمكنك تحريك شفافية العلامة باستخدام
Core Animation
من خلال GMSMarkerLayer.
تسوية العلامة
عادةً ما يتم رسم رموز العلامات موجّهةً نحو شاشة الجهاز بدلاً من سطح الخريطة، لذا لا يؤدي تدوير الخريطة أو إمالتها أو تكبيرها أو تصغيرها بالضرورة إلى تغيير اتجاه العلامة.
يمكنك ضبط اتجاه العلامة بحيث تكون مسطّحة على الأرض. تدور العلامات المسطّحة عند تدوير الخريطة، وتتغيّر المنظور عند إمالة الخريطة. كما هو الحال مع العلامات العادية، تحتفظ العلامات المسطّحة بحجمها عند تكبير الخريطة أو تصغيرها.
لتغيير اتجاه العلامة، اضبط السمة flat للعلامة على YES أو true.
Swift
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let londonMarker = GMSMarker(position: positionLondon) londonMarker.isFlat = true londonMarker.map = mapView
Objective-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 إلى تدوير العلامة حول مركزها بدلاً من قاعدتها.
Swift
let degrees = 90.0 londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5) londonMarker.rotation = degrees londonMarker.map = mapView
Objective-C
CLLocationDegrees degrees = 90; londonMarker.groundAnchor = CGPointMake(0.5, 0.5); londonMarker.rotation = degrees; londonMarker.map = mapView;
التعامل مع الأحداث على العلامات
يمكنك الاستماع إلى الأحداث التي تحدث على الخريطة، مثل عندما ينقر المستخدم على علامة. للاستماع إلى الأحداث، عليك تنفيذ بروتوكول الـ
GMSMapViewDelegate. راجِع أحداث العلامات و
الإيماءات لمعرفة كيفية التعامل مع
أحداث علامات معيّنة. يقدّم دليل الأحداث أيضًا قائمة بـ
الطرق في GMSMapViewDelegate. بالنسبة إلى أحداث "التجوّل الافتراضي"، راجِع
GMSPanoramaViewDelegate.