Dostosuj ustawienia kamery

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

  • Śledzenie – domyślny tryb kamery do nawigacji. Zmienia kąt widzenia na 45 stopni i ustawia kamerę za aktualną pozycją, zwróconą w kierunku jazdy. Podczas nawigacji aparat automatycznie dostosowuje się do kierunku jazdy. W tym trybie możesz też znaleźć się po naciśnięciu przycisku Wyśrodkuj na mapie. Po wybraniu tego trybu przycisk Wyśrodkuj jest niewidoczny.

  • Ogólny – wyświetla widok całej trasy, przybliżając ją w razie potrzeby, aby zmieściła się na mapie. Po wybraniu tego widoku widoczny jest przycisk Wyśrodkuj.

  • Wolny – umożliwia użytkownikowi zmianę widoku mapy za pomocą gestyk. W tym widoku kamera pozostaje nieruchoma. Jeśli użytkownik przewinie mapę lub ją powiększy podczas nawigacji, automatycznie przełączy się ona na ten widok. Po wybraniu tego widoku widoczny jest przycisk Przenieś do środka.

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 wyśrodkowywanie mapy

Gdy użytkownicy przesuwają mapę w trybie nawigacji, tryb kamery widoku mapy zmienia się z trybu śledzenia na tryb swobodny. Kamera wraca do tego trybu, gdy użytkownik naciśnie Wyśrodkuj. Możesz zautomatyzować powrót do trybu śledzenia, korzystając z timera, aby ustawić odstęp czasu między opuszczeniem trybu śledzenia a jego automatycznym włączeniem.

Przykład

Podany niżej przykład kodu sprawdza, czy użytkownik przesuwa mapę w trybie nawigacji. Jeśli tak, ustawia minutnik, aby przełączyć tryb kamery na tryb śledzenia, a po 5 sekundach wyśrodkowuje 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