Камера позволяет изменять пользовательскую точку обзора. Режимы камеры позволяют управлять поведением карты во время навигации. Чтобы задать режим камеры, установите свойство 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