Dostosowywanie kamery

Kamera umożliwia zmianę punktu widzenia użytkownika na mapie. Tryby kamery umożliwiają kontrolowanie zachowania mapy podczas nawigacji. Aby ustawić tryb kamery, ustaw właściwość cameraMode widoku mapy, podając jedną z tych stałych trybu kamery:

  • Śledzenie – domyślny tryb kamery podczas nawigacji. Zmienia kąt widzenia na 45 stopni i umieszcza kamerę za bieżącą pozycją, skierowaną w kierunku ruchu. Podczas nawigacji kamera automatycznie dostosowuje się do kierunku jazdy. Naciśnięcie przycisku Wyśrodkuj ponownie na mapie również spowoduje przełączenie na ten tryb. Gdy ten tryb jest wybrany, przycisk Wyśrodkuj ponownie jest niewidoczny.

  • Podsumowanie – wyświetla podsumowanie całej trasy, w razie potrzeby powiększając widok, aby zmieścić trasę na mapie. Gdy ten widok jest wybrany, widoczny jest przycisk Wyśrodkuj ponownie.

  • Bezpłatny – umożliwia użytkownikowi zmianę widoku mapy za pomocą gestów. W tym widoku kamera pozostaje nieruchoma. Jeśli użytkownik przesunie lub powiększy mapę podczas nawigacji, automatycznie przejdzie ona do tego widoku. Gdy ten widok jest wybrany, widoczny jest przycisk Wyśrodkuj ponownie.

Aby zmienić tryb kamery, ustaw właściwość cameraMode widoku mapy, jak pokazano poniżej:

Swift

// Set the mode to "overview":
mapView.cameraMode = .overview

// Set the mode to "free":
mapView.cameraMode = .free

// Set the mode to "following":
mapView.cameraMode = .following

Objective-C

// Set the mode to "overview":
mapView.cameraMode = GMSNavigationCameraModeOverview;

// Set the mode to "free":
mapView.cameraMode = GMSNavigationCameraModeFree;

// Set the mode to "following":
mapView.cameraMode = GMSNavigationCameraModeFollowing;

Automatyczne ponowne wyśrodkowywanie mapy

Gdy użytkownicy przesuwają mapę w trybie nawigacji, tryb kamery w widoku mapy zmienia się z trybu śledzenia na tryb swobodny. Kamera wraca do trybu śledzenia, gdy użytkownik naciśnie przycisk Wyśrodkuj ponownie. Możesz zautomatyzować powrót do trybu śledzenia, używając timera do ustawienia odstępu między wyjściem z trybu śledzenia a automatycznym powrotem do niego.

Przykład

Ten przykładowy kod sprawdza, czy użytkownik przesuwa mapę w trybie nawigacji. Jeśli tak, ustawia minutnik, aby po 5 sekundach przełączyć tryb kamery na tryb śledzenia i wyśrodkować mapę.

Swift

class YourViewController: UIViewController {

  @IBOutlet weak var mapView: GMSMapView!
  var autoFollowTimer: Timer!

  override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self
    ...
  }

  ...
}

/** Implements the GMSMapViewDelegate protocol. */
extension YourViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
    if mapView.navigator?.isGuidanceActive == false {return}
    if !gesture {return}

    autoFollowTimer?.invalidate()
    autoFollowTimer = Timer(
      timeInterval: TimeInterval(5.0),
      target: self,
      selector: #selector(recenterMap),
      userInfo: nil,
      repeats: false)
    RunLoop.current.add(autoFollowTimer, forMode: .default)
  }

  /** Centers the map in guidance mode. */
  @objc private func recenterMap() {
    if mapView.navigator?.isGuidanceActive == true {
       mapView.cameraMode = .following
    }

    autoFollowTimer.invalidate()
    autoFollowTimer = nil
  }
}

Objective-C

@interface YourViewController : UIViewController<GMSMapViewDelegate>
...
@end


@implementation YourViewController {
  GMSMapView *_mapView;
  NSTimer *_autoFollowTimer;
  ...
}

...

- (void)viewDidLoad {
  [super viewDidLoad];
  ...
  _mapView.delegate = self;
  ...
}

...

/** Implements the GMSMapViewDelegate protocol. */
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
  if (!_mapView.navigator.guidanceActive) return;
  if (!gesture) return;

  [_autoFollowTimer invalidate];
  _autoFollowTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                                      target:self
                                                    selector:@selector(recenterMap)
                                                    userInfo:nil
                                                     repeats:NO];
}

/** Centers the map in guidance mode. */
- (void)recenterMap {
  if (_mapView.navigator.guidanceActive) {
    _mapView.cameraMode = GMSNavigationCameraModeFollowing;
  }

  [_autoFollowTimer invalidate];
  _autoFollowTimer = nil;
}

@end