הסמנים מציינים מיקומים בודדים במפה.
כברירת מחדל, סמנים משתמשים בסמל רגיל בעל מראה משותף של מפות 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
. לחלופין, אפשר להסיר את כל שכבות-העל
(כולל סמנים) שמופיעים כרגע במפה, באמצעות קריאה לGMSMapView
clear
.
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:
, ומעבירים את
של התמונה שמתקבלת למאפיין הסמל של GMSMarker
.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
התאמה אישית של תמונת הסמן
אם ברצונך לשנות את תמונת ברירת המחדל של הסמן, תוכל להגדיר סמל מותאם אישית, באמצעות
מאפיין icon
או iconView
של הסמן. אם מגדירים את iconView
, ה-API
מתעלם מהמאפיין 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
, ללא קשר בערך בפועל. אפשר להחיל טרנספורמציות שפועלות מחוץ לגבולות, אבל האובייקט שציירתם חייב להיות בתוך גבולות האובייקט. הכול טרנספורמציות/שינויים מתועדים ומיישמים אותם. בקצרה: תצוגות משנה חייבות להיות שכלולה בתצוגה.
כדי להחליט מתי להגדיר את המאפיין tracksViewChanges
, צריך להעלות משקל
שיקולי ביצועים מול היתרונות של ציור מחדש של הסמן
באופן אוטומטי. לדוגמה:
- אם יש לכם סדרה של שינויים שצריך לבצע, אפשר לשנות את הנכס ל-
YES
ואז חזרה אלNO
. - כשאנימציה פועלת או שהתוכן נטען
באופן אסינכרוני, יש להשאיר את הנכס מוגדר ל-
YES
עד שהפעולות שהושלמו.
שינוי שקיפות הסמן
אפשר לשלוט בשקיפות של סמן באמצעות המאפיין opacity
שלו. צריך לציין את העכירות כערך של משתנה מסוג float בין 0.0 ל-1.0, כאשר 0 הוא שקוף לגמרי ו-1 הוא אטום לגמרי.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
אפשר להנפיש את שקיפות הסמן באמצעות [אנימציה ליבה]ליבה
אנימציה באמצעות 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. מידע על אירועי Street View זמין בכתובת
GMSPanoramaViewDelegate