
標記是用來標出地圖上的某個位置。
標記預設會使用標準圖示,外觀和風格與 Google 地圖一致。如要自訂標記,您可以變更預設標記的顏色、以自訂圖示取代標記圖片,或變更標記的其他屬性。
您可以開啟資訊視窗,回應標記上的點擊事件。資訊視窗會在標記上方的對話方塊視窗中顯示文字或圖片。您可以使用預設資訊視窗顯示文字,也可以建立自訂資訊視窗,完全掌控內容。
新增標記
如要新增標記,請建立包含 position 和 title 的 GMSMarker 物件,並設定其 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:標記在新增時會淡入。
移除標記
如要從地圖中移除標記,請將 GMSMarker 的 map 屬性設為 nil。或者,您也可以呼叫 GMSMapView clear 方法,移除地圖上目前的所有疊加層 (包括標記)。
Swift
let camera = GMSCameraPosition.camera( withLatitude: -33.8683, longitude: 151.2086, zoom: 6 ) let options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) // ... mapView.clear()
Objective-C
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; mapView = [[GMSMapView alloc] initWithOptions:options]; // ... [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 的 icon 屬性,藉此自訂預設標記圖片的顏色。
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
自訂標記圖片
如要變更預設標記圖片,可以使用標記的 icon 或 iconView 屬性設定自訂圖示。如果設定 iconView,API 會忽略 icon 屬性。
使用標記的 icon 屬性
下列程式碼片段會建立標記,並在 icon 屬性中提供 UIImage 做為自訂圖示。圖示會置中顯示在英國倫敦。程式碼片段假設您的應用程式包含名為「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 屬性,建立含有自訂圖示的標記,並以動畫呈現標記顏色變化。The snippet assumes that your application contains an image named "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 options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) 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]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; _mapView = [[GMSMapView alloc] initWithOptions:options]; 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 控制項階層定義標記,每個檢視畫面都有一組標準動畫功能。您可以變更標記大小、顏色和 Alpha 級別,以及套用任意轉換。iconView 屬性支援 UIView 所有可動畫屬性的動畫,但 frame 和 center 除外。
- 如果將
tracksViewChanges設為YES,UIView可能會耗用大量資源,導致電池用量增加。相較之下,單一影格UIImage是靜態的,不需要重新算繪。 - 如果畫面上有許多標記,且每個標記都有自己的
UIView,而且所有標記同時追蹤變更,部分裝置可能會難以算繪地圖。 iconView是檢視畫面的快照,因此不會回應使用者互動。- 無論
的實際值為何,檢視畫面的行為都會如同
clipsToBounds設為YES。您可以套用在邊界外運作的轉換,但繪製的物件必須位於物件邊界內。系統會監控並套用所有轉換/移位。簡而言之,子檢視畫面必須包含在檢視畫面中。 - 如要在
GMSMarker上使用-copyWithZone:,您必須先複製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;
您可以使用 GMSMarkerLayer,透過 Core Animation 建立標記不透明度動畫。
將標記設為平放
標記圖示通常會以裝置螢幕為參照基準繪製,而非地圖表面,因此旋轉、傾斜或縮放地圖不一定會改變標記的方向。
你可以設置一個標記的方向是平貼在地上。地圖旋轉時,平放標記會跟著旋轉;地圖傾斜時,標記也會改變角度。和一般標記一樣,縮放地圖時,平放標記的大小不會改變。
如要變更標記的方向,請將標記的 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。