Znaczniki wskazują pojedyncze lokalizacje na mapie.
Domyślnie znaczniki używają standardowej ikony o typowym wyglądzie i wyglądzie Map Google do własnych potrzeb. Jeśli chcesz dostosować znacznik, możesz zmienić jego kolor domyślnego znacznika lub zastąpić obraz znacznika własną ikoną lub zmienić inny właściwości znacznika.
W odpowiedzi na zdarzenie kliknięcia przypisane do znacznika możesz otworzyć informację okno. Okno informacyjne wyświetla tekst lub obrazy w oknie dialogowym nad znacznikiem. Możesz użyć domyślnego okna informacyjnego do wyświetlania tekstu lub utworzyć własne okno informacyjne, aby w pełni kontrolować jego zawartość.
Dodawanie znacznika
Aby dodać znacznik, utwórz obiekt GMSMarker
zawierający obiekty position
i
title
i ustaw wartość map
.
Poniższy przykład pokazuje, jak dodać znacznik do istniejącego
GMSMapView
obiekt. Znacznik jest tworzony we współrzędnych 10,10
i wyświetla się
ciąg „Hello world”, w oknie informacyjnym.
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;
Można animować dodawanie nowych znaczników do mapy, ustawiając parametr
marker.appearAnimation
na:
kGMSMarkerAnimationPop
, aby znacznik wyskoczył ze znacznikagroundAnchor
po dodaniu.kGMSMarkerAnimationFadeIn
, aby znacznik wygasł po dodaniu.
Usuwanie znacznika
Możesz usunąć znacznik z mapy, ustawiając właściwość map
atrybutu
GMSMarker
do nil
. Możesz też usunąć wszystkie nakładki
(wraz ze znacznikami) obecnie na mapie, wywołując 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];
Jeśli chcesz zmodyfikować znacznik po dodaniu go do mapy,
upewnij się, że przechowujesz obiekt GMSMarker
. Znacznik można modyfikować
później przez wprowadzenie zmian w tym obiekcie.
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;
Zmienianie koloru pisaka
Możesz dostosować kolor domyślnego obrazu znacznika, wysyłając żądanie zabarwienia
wersji domyślnej ikony z parametrem markerImageWithColor:
i przekazując parametr
obrazu do właściwości ikony GMSMarker
.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Dostosowywanie obrazu znacznika
Jeśli chcesz zmienić domyślny obraz znacznika, możesz ustawić ikonę niestandardową za pomocą funkcji
właściwości icon
lub iconView
znacznika. Jeśli ustawiono iconView
, interfejs API
ignoruje właściwość icon
.
Używanie właściwości icon
znacznika
Ten fragment kodu tworzy znacznik z ikoną niestandardową
UIImage
w usłudze icon
. Zlokalizowana jest w Londynie (Wielka Brytania).
zakłada, że aplikacja zawiera obraz o nazwie „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;
Jeśli tworzysz kilka znaczników z tym samym obrazem, użyj tej samej instancji.
po UIImage
dla każdego ze znaczników. Pomoże to zwiększyć skuteczność
podczas wyświetlania wielu znaczników.
Ten obraz może mieć wiele klatek. Dodatkowo alignmentRectInsets
respektowana jest właściwość, co jest przydatne, jeśli znacznik zawiera cień lub inny element
w regionie, którego nie można użyć.
Używanie właściwości iconView
znacznika
Ten fragment kodu tworzy znacznik z ikoną niestandardową przez ustawienie atrybutu
właściwości iconView
znacznika i animuje zmianę koloru znacznika.
Fragment ten zakłada, że aplikacja zawiera obraz o nazwie „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
Interfejs iconView
akceptuje UIView
, dlatego możesz mieć hierarchię standardowego interfejsu użytkownika
zawiera elementy sterujące służące do definiowania znaczników, a każdy widok ma standardowy zestaw animacji
funkcje zabezpieczeń. Możesz uwzględnić zmiany rozmiaru znacznika, koloru i litery alfa.
a także stosować dowolne przekształcenia. Właściwość iconView
obsługuje animację wszystkich właściwości animacji UIView
oprócz frame
i
center
Podczas korzystania z iconView
pamiętaj o tych uwagach:
- Gdy ustawiono
tracksViewChanges
, obiektUIView
może wymagać zasobów doYES
, co może zwiększyć wykorzystanie baterii. Dla porównania Pojedyncza klatkaUIImage
jest statyczna i nie trzeba jej ponownie renderować. - Niektóre urządzenia mogą mieć problem z renderowaniem mapy, jeśli masz włączonych wiele znaczników
a każdy znacznik ma własny element
UIView
, a wszystkie znaczniki jednocześnie. - Element
iconView
nie reaguje na interakcję użytkownika, ponieważ jest to podsumowanie widoku. - Widok działa tak, jakby widok
clipsToBounds
miał wartośćYES
, niezależnie od tego wartość rzeczywistą. Możesz zastosować przekształcenia, które działają poza granicami, ale narysowany obiekt musi znajdować się w granicach obiektu. Wszystkie przekształcenia/przesunięcia są monitorowane i stosowane. Krótko mówiąc: widoki podrzędne muszą być zawarte w widoku.
Aby zdecydować, kiedy ustawić właściwość tracksViewChanges
,
Względem wydajności w porównaniu z zaletami ponownego rysowania znacznika
automatycznie. Na przykład:
- Jeśli chcesz wprowadzić serię zmian, możesz zmienić właściwość na
YES
, a potem wróć do usługiNO
. - Gdy trwa animacja lub jest wczytywana zawartość
asynchronicznie, należy pozostawić właściwość ustawioną na
YES
do czasu wykonania działań są kompletne.
Zmienianie przezroczystości znacznika
Przezroczystość znacznika możesz kontrolować za pomocą jego właściwości opacity
. Zalecenia
określa przezroczystość jako liczbę zmiennoprzecinkową z zakresu od 0,0 do 1,0, gdzie 0 oznacza pełną przezroczystość.
a 1 – całkowita nieprzezroczysta.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Możesz animować przezroczystość znacznika za pomocą [Core Animation]Core
Animacja wykorzystująca GMSMarkerLayer
.
Spłaszczanie znacznika
Ikony znacznika są zwykle rysowane względem ekranu urządzenia, a nie powierzchnię mapy, więc obracanie, przechylanie czy powiększanie zmienić orientację znacznika.
Możesz ustawić płaską orientację znacznika względem ziemi. Stała znaczniki obracają się, gdy mapa jest obrócona, i zmieniają perspektywę, gdy mapa jest przechylony. Tak jak w przypadku standardowych znaczników, płaskie znaczniki zachowują swój rozmiar, gdy mapa jest powiększony lub pomniejszony.
Aby zmienić orientację znacznika, ustaw właściwość flat
znacznika na
YES
lub 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;
Obracanie znacznika
Aby obrócić znacznik wokół punktu zakotwiczenia, ustaw rotation
usłudze. Określ rotację jako typ CLLocationDegrees
mierzony w
w prawo. Jeśli znacznik jest na płaskiej pozycji,
Położenie domyślne to północ.
Ten przykład obraca znacznik o 90°. Ustawiam groundAnchor
na 0.5,0.5
powoduje obrót znacznika wokół jego środka,
jej podstawy.
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;
Obsługa zdarzeń na znacznikach
Możesz nasłuchiwać zdarzeń występujących na mapie, takich jak kliknięcie przycisku
znacznik. Aby nasłuchiwać zdarzeń, musisz zaimplementować funkcję
Protokół GMSMapViewDelegate
. Zobacz zdarzenia znaczników i
gestów, by nauczyć się obsługi
określonych zdarzeń. W przewodniku po wydarzeniach znajdziesz też listę zdarzeń,
w GMSMapViewDelegate. W przypadku wydarzeń Street View:
GMSPanoramaViewDelegate