Обработка событий маркера

В этом примере отображается карта с двумя маркерами. При нажатии на маркер камера масштабируется и поворачивается, чтобы сфокусироваться на выбранном маркере.

Начать

Прежде чем вы сможете опробовать пример кода, вам необходимо настроить среду разработки. Дополнительную информацию см . в примерах кода Maps SDK для iOS .

Посмотреть код

import GoogleMaps
import UIKit

final class MarkerEventsViewController: UIViewController {

 
private lazy var mapView: GMSMapView = {
   
let camera = GMSCameraPosition(latitude: -37.81969, longitude: 144.966085, zoom: 4)
   
return GMSMapView(frame: .zero, camera: camera)
 
}()

 
private var melbourneMarker = GMSMarker(
    position
: CLLocationCoordinate2D(latitude: -37.81969, longitude: 144.966085))

 
override func loadView() {
   
let sydneyMarker = GMSMarker(
      position
: CLLocationCoordinate2D(latitude: -33.8683, longitude: 151.2086))
    sydneyMarker
.map = mapView
    melbourneMarker
.map = mapView
    mapView
.delegate = self
    view
= mapView
 
}
}

extension
MarkerEventsViewController: GMSMapViewDelegate {
 
func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
   
if marker == melbourneMarker {
     
return UIImageView(image: UIImage(named: "Icon"))
   
}
   
return nil
 
}

 
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
   
// Animate to the marker
    CATransaction.begin()
   
CATransaction.setAnimationDuration(3)
   
let camera = GMSCameraPosition(target: marker.position, zoom: 8, bearing: 50, viewingAngle: 60)
    mapView
.animate(to: camera)
   
CATransaction.commit()

   
// Melbourne marker has a InfoWindow so return false to allow markerInfoWindow to
    // fire. Also check that the marker isn't already selected so that the InfoWindow
    // doesn't close.
    if marker == melbourneMarker && mapView.selectedMarker != melbourneMarker {
     
return false
   
}
   
return true
 
}
}
     
#import "GoogleMapsDemos/Samples/MarkerEventsViewController.h"

#import <QuartzCore/QuartzCore.h>

#import <GoogleMaps/GoogleMaps.h>

@implementation MarkerEventsViewController {
 
GMSMapView *_mapView;
 
GMSMarker *_melbourneMarker;
  BOOL _rotating
;
}

- (void)viewDidLoad {
 
[super viewDidLoad];
 
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969
                                                          longitude
:144.966085
                                                               zoom
:4];
  _mapView
= [GMSMapView mapWithFrame:CGRectZero camera:camera];

 
GMSMarker *sydneyMarker = [[GMSMarker alloc] init];
  sydneyMarker
.position = CLLocationCoordinate2DMake(-33.8683, 151.2086);
  sydneyMarker
.map = _mapView;

  _melbourneMarker
= [[GMSMarker alloc] init];
  _melbourneMarker
.position = CLLocationCoordinate2DMake(-37.81969, 144.966085);
  _melbourneMarker
.map = _mapView;

  _mapView
.delegate = self;
 
self.view = _mapView;
}

#pragma mark - GMSMapViewDelegate

- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
 
if (marker == _melbourneMarker) {
   
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon"]];
 
}

 
return nil;
}

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
 
GMSCameraPosition *camera = [[GMSCameraPosition alloc] initWithTarget:marker.position
                                                                   zoom
:8
                                                                bearing
:50
                                                           viewingAngle
:60];
 
// Animate to the marker
 
[CATransaction begin];
 
[CATransaction setAnimationDuration:3.f];  // 3 second animation
 
[CATransaction setCompletionBlock:^{
   
if (_rotating) {  // Animation was interrupted by orientation change.
     
[CATransaction
          setDisableActions
:true];  // Disable animation to avoid interruption from rotation.
     
[_mapView animateToCameraPosition:camera];
   
}
 
}];

 
[mapView animateToCameraPosition:camera];
 
[CATransaction commit];

 
// Melbourne marker has a InfoWindow so return NO to allow markerInfoWindow to fire. Also check
 
// that the marker isn't already selected so that the InfoWindow doesn't close.
 
if (marker == _melbourneMarker && mapView.selectedMarker != _melbourneMarker) {
   
return NO;
 
}

 
// The Tap has been handled so return YES
 
return YES;
}

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator
:(id<UIViewControllerTransitionCoordinator>)coordinator {
  _rotating
= true;
 
[coordinator
      animateAlongsideTransition
:nil
                      completion
:^(
                          id
<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
                        _rotating
= false;
                     
}];
 
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

@end
     

Запустите полный пример приложения локально

Пример приложения Maps SDK для iOS доступен в виде архива для загрузки на GitHub . Выполните следующие действия, чтобы установить и опробовать пример приложения Maps SDK для iOS.

  1. Запустите git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git , чтобы клонировать репозиторий образцов в локальный каталог.
  2. Откройте окно терминала, перейдите в каталог, в который вы клонировали файлы примеров, и перейдите к каталогу GoogleMaps:

    cd maps-sdk-for-ios-samples-main/GoogleMaps-Swift
    pod install
    open GoogleMapsSwiftDemos.xcworkspace
    cd maps-sdk-for-ios-samples-main/GoogleMaps
    pod install
    open GoogleMapsDemos.xcworkspace
  3. В Xcode нажмите кнопку компиляции, чтобы создать приложение с текущей схемой. При сборке возникает ошибка, предлагающая ввести ключ API в файл SDKConstants.swift для Swift или файл SDKDemoAPIKey.h для Objective-C.
  4. Если у вас еще нет ключа API, следуйте инструкциям , чтобы настроить проект в Google Cloud Console и получить ключ API. При настройке ключа в Cloud Console вы можете ограничить ключ идентификатором пакета примера приложения, чтобы гарантировать, что только ваше приложение может использовать ключ. Идентификатор пакета по умолчанию для примера приложения SDK — com.example.GoogleMapsDemos .
  5. Отредактируйте файл SDKConstants.swift для Swift или файл SDKDemoAPIKey.h для Objective-C и вставьте свой ключ API в определение константы apiKey или kAPIKey . Например:
    static let apiKey = "YOUR_API_KEY"
    static NSString *const kAPIKey = @"YOUR_API_KEY";
  6. В файле SDKConstants.swift (Swift) или файле SDKDemoAPIKey.h (Objective-C) удалите следующую строку, поскольку она используется для регистрации определяемой пользователем проблемы:
    #error (Register for API Key and insert here. Then delete this line.)
    #error Register for API Key and insert here.
  7. Создайте и запустите проект. Появится окно симулятора iOS со списком демонстраций Maps SDK .
  8. Выберите один из отображаемых вариантов, чтобы поэкспериментировать с функцией Maps SDK для iOS.
  9. Если будет предложено разрешить GoogleMapsDemos доступ к вашему местоположению, выберите «Разрешить» .