Камера позволяет изменять пользовательскую точку обзора. Режимы камеры позволяют управлять поведением карты во время навигации. Чтобы задать режим камеры, установите для свойства cameraMode объекта представления карты одну из следующих констант режима камеры:
"Слежение" – режим камеры по умолчанию для навигации. Угол обзора меняется на 45 градусов, а камера перемещается за текущую позицию и направляется в сторону движения. Во время навигации камера автоматически поворачивается в направлении движения. Этот режим также включается при нажатии кнопки Центрировать на карте. В этом режиме кнопка Центрировать не видна.
Обзор – показывает весь маршрут, при необходимости изменяя масштаб, чтобы маршрут поместился на карте. В этом режиме видна кнопка Перецентрировать.
Free – позволяет пользователю менять вид карты с помощью жестов. В этом режиме камера остается неподвижной. Карта автоматически перейдет в этот режим, если пользователь будет панорамировать или масштабировать ее во время навигации. В этом режиме доступна кнопка Центрировать.
Чтобы изменить режим камеры, задайте свойство cameraMode для представления карты, как показано ниже:
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;
Автоматически центрировать карту
Когда пользователь перемещает карту в режиме навигации, режим камеры для карты меняется с режима слежения на свободный. Камера вернется в режим слежения, когда пользователь нажмет кнопку Повторно центрировать. Вы можете автоматизировать возврат в режим следования, используя таймер, чтобы установить интервал между выходом из режима следования и автоматическим возвратом в него.
Пример
В следующем примере кода проверяется, перемещает ли пользователь карту в режиме навигации. Если да, то устанавливается таймер, который через пять секунд переключает режим камеры на слежение и центрирует карту.
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