Znaczniki

Wybierz platformę: Android iOS JavaScript

Znaczniki wskazują pojedyncze lokalizacje na mapie.

Domyślnie znaczniki używają standardowej ikony, która ma wygląd podobny do Map Google. Jeśli chcesz dostosować znacznik, możesz zmienić jego kolor, zastąpić obrazek niestandardową ikoną lub zmienić inne właściwości znacznika.

W odpowiedzi na zdarzenie kliknięcia znacznika możesz otworzyć okno informacyjne. W oknie informacyjnym nad znacznikiem wyświetla się tekst lub obrazy. Możesz użyć domyślnego okna informacyjnego, aby wyświetlić tekst, lub utworzyć własne niestandardowe okno informacyjne, aby mieć pełną kontrolę nad jego zawartością.

Dodawanie znacznika

Aby dodać znacznik, utwórz obiekt GMSMarker, który zawiera elementy positiontitle, a następnie ustaw jego właściwość map.

W tym przykładzie pokazano, jak dodać znacznik do istniejącego obiektu GMSMapView. Marker jest tworzony w współrzędnych 10,10 i po kliknięciu wyświetla w oknie informacji ciąg znaków „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;
      

Możesz animować dodawanie nowych znaczników na mapie, ustawiając dla właściwości marker.appearAnimation jedną z tych wartości:

  • kGMSMarkerAnimationPop, aby po dodaniu markera groundAnchor został on odseparowany od reszty.
  • kGMSMarkerAnimationFadeIn, aby po dodaniu znacznik pojawiał się stopniowo.

Usuwanie znacznika

Możesz usunąć znacznik z mapy, ustawiając właściwość map obiektu GMSMarker na wartość nil. Możesz też usunąć wszystkie nakładki (w tym znaczniki) znajdujące się obecnie na mapie, wywołując metodę 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 wprowadzić zmiany w markerze po dodaniu go do mapy, pamiętaj, aby zachować obiekt GMSMarker. Możesz zmodyfikować znacznik, wprowadzając zmiany 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;
      

Zmiana koloru znacznika

Kolor domyślnego obrazu znacznika możesz dostosować, prosząc o wersję z przyciemnieniem ikony domyślnej za pomocą funkcji markerImageWithColor: i przekazując uzyskany obraz do właściwości ikony elementu 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ć niestandardową ikonę, korzystając z właściwości icon lub iconView znacznika. Jeśli właściwość iconView jest ustawiona, interfejs API ignoruje właściwość icon.

Korzystanie z właściwości icon znacznika

Podany niżej fragment kodu tworzy znacznik z niestandardową ikoną podaną jako UIImage w właściwości icon. Ikona jest wyśrodkowana na Londynie w Wielkiej Brytanii. Fragment kodu 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 tego samego wystąpienia UIImage dla każdego z nich. Pomoże to poprawić wydajność aplikacji podczas wyświetlania wielu znaczników.

Ten obraz może mieć wiele klatek. Dodatkowo uwzględniana jest właściwość alignmentRectInsets, co jest przydatne, jeśli znacznik ma cień lub inny nieużyteczny region.

Korzystanie z właściwości iconView znacznika

Podany niżej fragment kodu tworzy znacznik z niestandardową ikoną, ustawiając właściwość iconView znacznika, i animuje zmianę koloru znacznika. Fragment kodu 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
      

Funkcja iconView przyjmuje parametr UIView, więc możesz mieć hierarchię standardowych elementów sterujących interfejsem użytkownika definiujących znaczniki, przy czym każde z widoków ma standardowy zestaw możliwości animacji. Możesz wprowadzić zmiany rozmiaru, koloru i poziomu przezroczystości znacznika, a także zastosować dowolne przekształcenia. Właściwość iconView obsługuje animację wszystkich właściwości typu UIView, które można animować, z wyjątkiem właściwości framecenter.

Podczas korzystania z funkcji iconView należy wziąć pod uwagę te kwestie:

  • UIView może wymagać wielu zasobów, gdy parametr tracksViewChanges jest ustawiony na YES, co może spowodować zwiększone zużycie baterii. Z kolei pojedynczy kadr UIImage jest statyczny i nie wymaga ponownego renderowania.
  • Na niektórych urządzeniach może wystąpić problem z renderowaniem mapy, jeśli na ekranie jest dużo znaczników, a każdy z nich ma swój własny UIView i wszystkie znaczniki śledzą zmiany w tym samym czasie.
  • Element iconView nie reaguje na interakcje użytkownika, ponieważ jest to migawka widoku.
  • Widok zachowuje się tak, jakby parametr clipsToBounds miał wartość YES, niezależnie od jego rzeczywistej wartości. Możesz stosować przekształcenia, które działają poza granicami obiektu, ale rysowany obiekt musi znajdować się w ramach obiektu. Wszystkie przekształcenia i zmiany 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, należy porównać kwestie związane z wydajnością z zaletami automatycznego odświeżania znacznika. Na przykład:

  • Jeśli chcesz wprowadzić serię zmian, możesz zmienić usługę na YES, a potem z powrotem na NO.
  • Gdy animacja jest uruchomiona lub treści są wczytywane asynchronicznie, należy ustawić właściwość na YES, dopóki działania nie zostaną ukończone.

Zmiana nieprzezroczystości znacznika

Za pomocą właściwości opacity możesz kontrolować przezroczystość znacznika. Należy określić przezroczystość jako wartość zmiennoprzecinkową z zakresu od 0,0 do 1,0, gdzie 0 to pełna przezroczystość, a 1 to brak przezroczystości.

Swift

marker.opacity = 0.6
      

Objective-C

marker.opacity = 0.6;
      

Możesz animować przezroczystość znacznika za pomocą podstawowej animacji, używając GMSMarkerLayer.

Spłaszczanie znacznika

Ikony znaczników są zwykle rysowane w orientacji zgodnej z ekranem urządzenia, a nie z powierzchnią mapy, więc obracanie, przechylanie lub powiększanie mapy niekoniecznie zmienia orientację znacznika.

Możesz ustawić orientację znacznika tak, aby był płaski na powierzchni Ziemi. znaczniki płaskie obracają się, gdy obracasz mapę, i zmieniają perspektywę, gdy ją nachylasz; Podobnie jak w przypadku zwykłych znaczników, znaczniki płaskie zachowują swój rozmiar podczas powiększania lub pomniejszania mapy.

Aby zmienić orientację znacznika, ustaw jego właściwość flat 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

Możesz obracać znacznik wokół punktu zakotwiczenia, ustawiając właściwość rotation. Określ obrót jako typ CLLocationDegrees, mierzony w stopniach w kierunku zgodnym z ruchem wskazówek zegara od pozycji domyślnej. Gdy znacznik jest płaski na mapie, domyślną pozycją jest północ.

W tym przykładzie znacznik jest obracany o 90°. Ustawienie właściwości groundAnchor na 0.5,0.5 powoduje, że znacznik jest obracany wokół środka, a nie 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, np. gdy użytkownik kliknie znacznik. Aby nasłuchiwać zdarzeń, musisz zaimplementować protokół GMSMapViewDelegate. Aby dowiedzieć się, jak obsługiwać określone zdarzenia znacznika, zapoznaj się z artykułem Zdarzenia znacznika i gesty. Przewodnik po zdarzeniach zawiera też listę metod GMSMapViewDelegate. Informacje o wydarzeniach Street View znajdziesz w artykule GMSPanoramaViewDelegate.