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 cámara, establece la propiedad cameraMode de la vista de mapa y especifica una de las siguientes constantes de modo de cámara:
Following: 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 del viaje. Durante la navegación, la cámara se ajusta automáticamente para orientarse 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 está visible cuando se selecciona este modo.
Overview: Muestra una descripción general de toda la ruta y aplica el zoom según sea necesario para que la ruta quepa en la vista de mapa. Cuando se selecciona esta vista, el botón Volver a centrar está visible.
Free: Permite que el usuario cambie la vista de mapa con gestos. La cámara permanece inmóvil en esta vista. El mapa ingresará automáticamente a esta vista si el usuario se desplaza o aplica el zoom durante la navegación. Cuando se selecciona esta vista, el botón Volver a centrar está visible.
Para cambiar el modo de 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 de 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í, 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