Dostosuj ustawienia kamery

Kamera umożliwia zmianę punktu widzenia użytkownika na mapie. Za pomocą trybów aparatu możesz kontrolować zachowanie mapy podczas nawigacji. Aby ustawić tryb aparatu, skonfiguruj właściwość cameraMode widoku mapy, wskazując jedną z tych stałych trybu aparatu:

  • Obserwowane – domyślny tryb aparatu do nawigacji. Zmienia kąt widzenia na 45 stopni i umieszcza kamerę w bieżącym położeniu w kierunku jazdy. Podczas nawigacji kamera automatycznie dostosowuje się do kierunku jazdy. Naciśnięcie przycisku Wyśrodkuj ponownie mapy również spowoduje przejście do tego trybu. Po wybraniu tego trybu przycisk Wyśrodkuj jest niewidoczny.

  • Przegląd – wyświetla przegląd całej trasy, powiększając w razie potrzeby, aby zmieściła się w widoku mapy. Po wybraniu tego widoku widoczny jest przycisk Wyśrodkuj.

  • Bezpłatnie – pozwala użytkownikowi zmieniać widok mapy za pomocą gestów. Kamera pozostaje nieruchoma w tym widoku. Jeśli użytkownik przesuwa lub powiększy widok podczas nawigacji, automatycznie otworzy się ten widok. Po wybraniu tego widoku widoczny będzie przycisk Wyśrodkuj.

Aby zmienić tryb aparatu, ustaw właściwość cameraMode widoku mapy, jak pokazano tutaj:

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;

Automatycznie wyśrodkuj mapę

Gdy użytkownik przesuwa mapę w trybie nawigacji, tryb aparatu w widoku mapy zmienia się z trybu poniżej na tryb bezpłatny. Kamera wróci do trybu następnego, gdy użytkownik jawnie naciśnie Wyśrodkuj. Możesz zautomatyzować powrót do trybu następnego za pomocą licznika czasu, który ustawi odstęp między wyjściem z trybu śledzenia, a potem automatycznym powrociem do niego.

Przykład

Poniższy przykładowy kod pozwala sprawdzić, czy użytkownik porusza mapę w trybie nawigacji. Jeśli tak, ustawia licznik czasu, który przełącza tryb aparatu w tryb podążania i wyśrodkowuje mapę po 5 sekundach.

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