Ajustar la cámara

La cámara te permite cambiar el punto de vista del usuario en el mapa. Puedes usar los modos de la cámara para controlar el comportamiento del mapa durante la navegación. Para configurar el modo de cámara, establece la propiedad cameraMode de la vista de mapa y especifica una de las siguientes constantes del modo de cámara:

  • Siguiendo: El modo de cámara predeterminado para la navegación. Cambia el ángulo de visión a 45 grados y coloca la cámara detrás de la posición actual orientada en la dirección de desplazamiento. Durante la navegación, la cámara se ajusta automáticamente a la cara en la dirección del viaje. Si presionas el botón Volver a centrar del mapa, también se cambiará a este modo. El botón Volver a centrar no se ve cuando se selecciona este modo.

  • Descripción general: Muestra una descripción general de toda la ruta, con zoom según sea necesario para que la ruta se ajuste a la vista de mapa. Cuando se selecciona esta vista, se muestra el botón Volver a centrar.

  • Gratis: Permite que el usuario cambie la vista de mapa con gestos. En esta vista, la cámara permanece fija. El mapa ingresará automáticamente a esta vista si el usuario se desplaza lateralmente o hace zoom durante la navegación. Cuando se selecciona esta vista, se muestra el botón Volver a centrar.

Para cambiar el modo de la cámara, configura la propiedad cameraMode de la vista de mapa, como se muestra a continuación:

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;

Volver a centrar el mapa automáticamente

Cuando los usuarios mueven el mapa en el modo de navegación, el modo de cámara de la vista de mapa cambia del siguiente modo al modo libre. La cámara regresa al modo siguiente cuando el usuario presiona explícitamente Volver a centrar. Puedes automatizar el regreso al modo siguiente si usas un temporizador para establecer un intervalo entre salir del modo siguiente y regresar automáticamente a él.

Ejemplo

En el siguiente ejemplo de código, se verifica si el usuario mueve el mapa mientras se está en el modo de navegación. Si es así, se establece un temporizador para cambiar el modo de cámara al modo de seguimiento y centrar el mapa después de cinco segundos.

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