Все готово!

Прежде чем приступить к разработке, ознакомьтесь с документацией для разработчиков.

Активация Google Maps SDK for iOS

Чтобы помочь вам освоиться, мы покажем, как выполнить некоторые необходимые действия в консоли разработчика Google:

  1. Создание или выбор проекта
  2. Активация Google Maps SDK for iOS
  3. Создание соответствующих ключей

Маркеры

Маркеры обозначают отдельные местоположения на карте.

По умолчанию, для маркеров используется стандартный значок согласованного с Google Maps внешнего вида. Если вы хотите настроить свой маркер, можно изменить цвет маркера по умолчанию или заменить значок маркера на пользовательский, а также изменить другие свойства маркера.

Добавление маркера

Чтобы добавить маркер, создайте объект GMSMarker, включающий свойства position и title, и настройте его свойство 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.

Удаление маркера

Маркер с карты можно удалить, установив в свойстве map объекта GMSMarker значение nil. В качестве альтернативы можно удалить все наложения (включая маркеры), которые в настоящий момент имеются на карте, вызвав для объекта 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];

Если вам необходимо изменить или удалить маркер после его добавления на карту, убедитесь в наличии привязки к объекту GMSMarker. Этот маркер можно изменить позже, внеся изменения в этот объект.

Swift

let marker = GMSMarker(position: position)
marker.map = mapView
...
marker.map = nil

Objective-C

GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.map = mapView;
...
marker.map = nil

Изменение цвета маркера

Вы можете изменить цвет для изображения маркера по умолчанию, запросив цветную версию стандартного значка с помощью markerImageWithColor: и передав полученное изображение в свойство значка для объектаGMSMarker.

Swift

marker.icon = GMSMarker.markerImage(with: .black)

Objective-C

marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];

Изменение изображения маркера

Если вы хотите изменить изображение маркера по умолчанию, можно задать пользовательский значок, используя свойства маркера icon или iconView.

Если установлено свойство iconView, API игнорирует свойство icon. Изменения в действующем свойстве icon не учитываются, пока установлено свойство iconView.

Использование свойства icon в маркере

Следующий фрагмент кода создает маркер с пользовательским значком, представленным как UIImage в свойстве icon. Значок установлен в г. Лондон, Англия. В этом фрагменте кода предполагается, что ваше приложение содержит изображение с именем "house.png".

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: position)
london.title = "London"
london.icon = UIImage(named: "house")
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView;

Если вы создаете несколько маркеров с одинаковым изображением, используйте для каждого из них один и тот же экземпляр объекта UIImage. Это повышает быстродействие вашего приложения при отображении большого количества маркеров.

Для этого изображения можно использовать различные рамки. Кроме того, учитывается свойство alignmentRectInsets, что полезно, если у маркера имеется тень или другая неиспользуемая область.

Использование свойства iconView в маркере

Следующий фрагмент кода создает маркер с пользовательским значком и анимацией изменения его цвета, задавая в маркере свойство iconView. В этом фрагменте кода предполагается, что ваше приложение содержит изображение с именем "house.png".

Swift

import UIKit
import GoogleMaps

class ViewController: UIViewController, GMSMapViewDelegate {
  var mapView: GMSMapView!
  var london: GMSMarker?
  var londonView: UIImageView?

  override func loadView() {

    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 "ViewController.h"
@import GoogleMaps;

@interface ViewController () <GMSMapViewDelegate>
@property (strong, nonatomic) GMSMapView *mapView;
@end

@implementation ViewController {
  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:^{
                     _londonView.tintColor = [UIColor blueColor];
                   }
                   completion:^(BOOL finished) {
                     // Stop tracking view changes to allow CPU to idle.
                     _london.tracksViewChanges = NO;
                   }];
}

@end

Поскольку свойство iconView принимает значение UIView, вы можете иметь иерархию стандартных элементов пользовательского интерфейса, определяющую ваши маркеры, каждый из которых обладает стандартным набором анимационных возможностей. Можно менять размер маркера, его цвет и прозрачность, а также применять произвольные трансформации. Свойство iconView поддерживает анимацию всех анимируемых свойств UIView кроме frame и center.

При использовании iconView обратите внимание на следующее:

  • Объект UIView может потреблять значительное количество ресурсов, когда tracksViewChanges установлен в положение YES, что может привести к увеличенному потреблению заряда аккумулятора. В сравнении с ним, однокадровый объект UIImage статичен и не требует повторных отображений.
  • Некоторые устройства могут испытывать проблемы при отображении карты, если на экране имеется много маркеров, у каждого из них есть собственный объект UIView, при этом все они одновременно отслеживают изменения.
  • Свойство iconView не отвечает на действия пользователя, поскольку является моментальным снимком представления.
  • Представление ведет себя так, как если бы для clipsToBoundsбыло задано YES, независимо от его фактического значения. Можно применять трансформации, которые действуют за пределами границ, но объект, который вы строите, должен быть в границах объекта. Отслеживаются и применяются все трансформации и сдвиги. Кратко: все части представления должны содержаться внутри представления.

Чтобы решить, когда устанавливать свойство tracksViewChanges, следует оценить его влияние на производительность с одной стороны, а также преимущества автоматической перерисовки маркера с другой. Например:

  • Если необходимо произвести цепочку изменений, можно установить для свойства значение YES, а затем обратно NO.
  • Когда выполняется анимация или контент загружается асинхронно, необходимо сохранять значение свойства как YES пока операции не завершатся.

Изменение непрозрачности маркера

Для изменения непрозрачности маркера можно использовать его свойство opacity. Непрозрачность следует указывать как число с плавающей точкой между 0.0 и 1.0, где 0 – это полная прозрачность и 1 – это полная непрозрачность.

Swift

marker.opacity = 0.6

Objective-C

marker.opacity = 0.6;

Прозрачность маркера можно анимировать с помощью базовой анимации, используя слой GMSMarkerLayer.

Создание плоского маркера

Как правило, значки маркеров прорисовываются ориентированными относительно экрана устройства, а не поверхности карты, поэтому возможно вращение, наклон или масштабирование карты, это не приведет к изменению ориентации маркера.

Можно установить плоскую ориентацию маркера относительно земной поверхности. Плоские маркеры вращаются вместе с картой и изменяют перспективу, когда она наклоняется. Как и обычные маркеры, плоские маркеры сохраняют свой размер, когда масштаб карты увеличивается или уменьшается.

Чтобы изменить ориентацию маркера на карте, необходимо для свойства flat указать значение YES или true.

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: position)
london.isFlat = true
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.flat = YES;
london.map = mapView;

Вращение маркера

Вы можете вращать маркер вокруг его точки привязки, установив свойство rotation. Укажите поворот как тип CLLocationDegrees, измеряемый в градусах по часовой стрелке из положения по умолчанию. Когда маркер на карте плоский, то в качестве положения по умолчанию используется ориентация на север.

В следующем примере маркер поворачивается на 90°. При установке для свойства groundAnchor значения0.5,0.5 этот маркер будет вращаться вокруг своего центра, а не вокруг своего основания.

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let degrees = 90.0
let london = GMSMarker(position: position)
london.groundAnchor = CGPoint(x: 0.5, y: 0.5)
london.rotation = degrees
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
CLLocationDegrees degrees = 90;
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.groundAnchor = CGPointMake(0.5, 0.5);
london.rotation = degrees;
london.map = mapView;

Добавление информационного окна

Чтобы отображать информацию пользователю, когда он касается маркера, применяйте информационное окно. Одновременно может открываться только одно окно. Если пользователь коснется другого маркера, текущее информационное окно закроется и откроется новое. Содержимое информационного окна определяется свойствами title и snippet. Касание маркера не приводит к открытию окна, если для обоих свойств title и snippet значения не указаны или указано значение nil.

В приведенном ниже фрагменте кода показано создание простого маркера, содержащего только заголовок для текста информационного окна.

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: position)
london.title = "London"
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.map = mapView;

С помощью свойства snippet вы можете добавлять дополнительный текст, который отобразится под заголовком с использованием уменьшенного шрифта. Строки, более длинные чем ширина информационного окна, автоматически распределяются на несколько строк. Очень длинные сообщения могут быть сокращены.

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: position)
london.title = "London"
london.snippet = "Population: 8,174,100"
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.snippet = @"Population: 8,174,100";
london.map = mapView;

Настройка автоматического обновления информационного окна

Присвойте свойству маркера tracksInfoWindowChanges значение YES либо true если хотите, чтобы новые свойства или содержимое информационного окна отображалось при его изменении мгновенно, а не после ожидания, когда информационное окно скроется и отобразится снова. Значение по умолчанию – NO либо false.

Swift

marker.tracksInfoWindowChanges = true

Objective-C

marker.tracksInfoWindowChanges = YES;

Чтобы решить, когда устанавливать свойство tracksInfoWindowChanges, следует оценить его влияние на производительность с одной стороны и преимущества автоматической перерисовки информационного окна с другой. Например:

  • Если необходимо произвести цепочку изменений, можно установить для свойства значение YES, а затем обратно NO.
  • Когда выполняется анимация или контент загружается асинхронно, необходимо сохранять значение свойства как YES пока операции не завершатся.

См. также следующую памятку при использовании свойства маркера iconView.

Изменение положения информационного окна

Информационное окно ориентировано по экрану устройства и отображается по центру над связанным с ним маркером. Вы можете изменить положение информационного окна по отношению к маркеру, установив свойство infoWindowAnchor. В это свойство передается параметр CGPoint, определенный как смещение (x,y) где для x и y используются значения в диапазоне от 0.0 до 1.0. Смещением по умолчанию является (0.5, 0.0), то есть, в центре сверху. Установка отступа infoWindowAnchor полезна для выравнивания информационного окна относительно пользовательского значка.

Swift

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: position)
london.title = "London"
london.snippet = "Population: 8,174,100"
london.infoWindowAnchor = CGPoint(x: 0.5, y: 0.5)
london.icon = UIImage(named: "house")
london.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.snippet = @"Population: 8,174,100";
london.infoWindowAnchor = CGPointMake(0.5, 0.5);
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView;

Обработка событий маркеров и информационных окон

Вы можете отслеживать события на карте, например, когда пользователь касается маркера или информационного окна. Чтобы отслеживать события, вам необходимо реализовать протокол GMSMapViewDelegate. См. руководство с описанием событий и список методов для GMSMapViewDelegate. Информацию о событиях просмотра улиц см. GMSPanoramaViewDelegate.

Оставить отзыв о...

Текущей странице
Google Maps SDK for iOS
Google Maps SDK for iOS
Нужна помощь? Обратитесь в службу поддержки.