Cómo ajustar la cámara

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

  • Seguir: Es 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 para mirar en la dirección del viaje. Si presionas el botón Volver a centrar del mapa, también cambiarás a este modo. El botón Volver a centrar no está visible cuando se selecciona este modo.

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

  • Libre: Permite que el usuario cambie la vista del mapa con gestos. La cámara permanece fija en esta vista. El mapa entrará automáticamente en 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, establece la propiedad cameraMode de la vista de mapa, como se muestra aquí:

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;

Cómo 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 del mapa cambia del modo de seguimiento al modo libre. La cámara vuelve al modo de seguimiento cuando el usuario presiona Volver a centrar de forma explícita. Puedes automatizar el regreso al modo de seguimiento con un temporizador para establecer un intervalo entre la salida del modo de seguimiento y el regreso automático a él.

Ejemplo

En el siguiente ejemplo de código, se verifica si el usuario está moviendo el mapa mientras está en el modo de navegación. Si es así, establece un temporizador para cambiar el modo de la 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