Маркеры обозначают отдельные места на карте.
По умолчанию маркеры используют стандартный значок, который имеет общий дизайн и функции Google Карт. Если вы хотите настроить маркер, вы можете изменить цвет маркера по умолчанию, заменить изображение маркера на собственный значок или изменить другие свойства маркера.
В ответ на щелчок по маркеру можно открыть информационное окно . Информационное окно отображает текст или изображения в диалоговом окне над маркером. Вы можете использовать информационное окно по умолчанию для отображения текста или создать собственное информационное окно, чтобы полностью контролировать его содержимое.
Добавление маркера
Чтобы добавить маркер, создайте объект GMSMarker
, включающий position
и title
, а также задайте его map
.
В следующем примере показано, как добавить маркер к существующему объекту GMSMapView
. Маркер создаётся в точке с координатами 10,10
и при щелчке по нему в информационном окне отображается строка «Hello world».
Быстрый
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
. Кроме того, вы можете удалить все текущие наложения (включая маркеры) на карте, вызвав метод clear
объекта GMSMapView
.
Быстрый
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
у вас сохранился. Вы сможете изменить маркер позже, внеся изменения в этот объект.
Быстрый
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
.
Быстрый
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Настройка изображения маркера
Если вы хотите изменить изображение маркера по умолчанию, вы можете задать собственный значок, используя свойство маркера icon
или iconView
. Если установлено iconView
, API игнорирует свойство icon
.
Использование свойства icon
маркера
Следующий фрагмент кода создаёт маркер с пользовательским значком, заданным как UIImage
в свойстве icon
. Центр значка находится в Лондоне, Англия. В этом фрагменте предполагается, что ваше приложение содержит изображение с именем «house.png».
Быстрый
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».
Быстрый
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
, независимо от его фактического значения. Вы можете применять преобразования, работающие за пределами границ, но отрисовываемый объект должен находиться внутри границ объекта. Все преобразования/сдвиги отслеживаются и применяются. Другими словами: подпредставления должны содержаться внутри представления. - Чтобы использовать
-copyWithZone:
дляGMSMarker
, необходимо сначала скопироватьGMSMarker
, а затем установить новый экземплярiconView
для копии.UIView
не поддерживаетNSCopying
, поэтому он не может скопироватьiconView
.
Чтобы решить, когда следует задать свойство tracksViewChanges
, следует взвесить соображения производительности и преимущества автоматической перерисовки маркера. Например:
- Если вам необходимо внести ряд изменений, вы можете изменить свойство на
YES
а затем обратно наNO
. - Когда анимация запущена или содержимое загружается асинхронно, следует оставить свойство равным
YES
до завершения действий.
Изменение непрозрачности маркера
Вы можете управлять непрозрачностью маркера с помощью его свойства opacity
. Значение непрозрачности должно быть задано как число с плавающей точкой в диапазоне от 0,0 до 1,0, где 0 соответствует полной прозрачности, а 1 — полной непрозрачности.
Быстрый
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Вы можете анимировать непрозрачность маркера с помощью Core Animation, используя GMSMarkerLayer
.
Сглаживание маркера
Значки маркеров обычно рисуются с ориентацией относительно экрана устройства, а не поверхности карты, поэтому поворот, наклон или масштабирование карты не обязательно изменяют ориентацию маркера.
Вы можете задать ориентацию маркера так, чтобы он был расположен горизонтально относительно Земли. Плоские маркеры вращаются при повороте карты и меняют перспективу при её наклоне. Как и обычные маркеры, плоские маркеры сохраняют свой размер при увеличении или уменьшении масштаба карты.
Чтобы изменить ориентацию маркера, задайте для свойства flat
маркера значение YES
или true
.
Быстрый
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
приводит к вращению маркера вокруг его центра, а не основания.
Быстрый
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
.