Ajustar la cámara

La cámara te permite cambiar el punto de vista del usuario del 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 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 viaje. Durante la navegación, la cámara se ajusta automáticamente para orientarse en la dirección de viaje. Si presionas el botón Volver a centrar del mapa, también cambiarás a este modo. El botón Re-center no se puede ver cuando se selecciona este modo.

  • Descripción general: Muestra una descripción general de toda la ruta y ajusta el zoom según sea necesario para que se ajuste a la vista del mapa. Cuando se selecciona esta vista, se muestra el botón Re-center.

  • Libre: Permite que el usuario cambie la vista del mapa con gestos. La cámara permanece inmóvil en esta vista. El mapa entrará automáticamente en esta vista si el usuario se desplaza lateralmente o aplica zoom durante la navegación. Cuando se selecciona esta vista, se muestra el botón Re-center.

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;

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 de forma explícita Re-center. Puedes automatizar el regreso al modo de seguimiento con un temporizador para establecer un intervalo entre salir del modo de seguimiento y volver a él automáticamente.

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í, 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