Znaczniki

Wybierz platformę: Android iOS JavaScript

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, zastąpić obrazek niestandardową ikoną lub zmienić inne 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 znacznika groundAnchor 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 wprowadzić zmiany w markerze po dodaniu go do mapy, pamiętaj, aby zachować 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 w regionie, którego nie można użyć.

Używanie właściwości iconView znacznika

Ten fragment kodu tworzy znacznik z niestandardową ikoną, ustawiając właściwość 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, koloru i poziomów przezroczystości znacznika, a także zastosować 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, obiekt UIView może wymagać zasobów do YES, co może zwiększyć wykorzystanie baterii. Dla porównania Pojedyncza klatka UIImage jest statyczna i nie trzeba jej ponownie renderować.
  • Jeśli na ekranie masz wiele znaczników, a każdy z nich ma swoją własną UIView i wszystkie znaczniki śledzą zmiany w tym samym czasie, niektóre urządzenia mogą mieć problemy z renderowaniem mapy.
  • iconView nie reaguje na interakcje użytkownika, ponieważ jest to migawka 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ć usługę na YES, a potem z powrotem na NO.
  • 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

Za pomocą właściwości opacity możesz kontrolować przezroczystość znacznika. 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 stopni w kierunku zgodnym z ruchem wskazówek zegara. Gdy 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