Камера позволяет изменять точку обзора карты пользователем. Вы можете использовать режимы камеры для управления поведением карты во время навигации. Чтобы установить режим камеры, задайте свойство cameraMode представления карты, указав одну из следующих констант режима камеры:
Режим «Следующее направление» — режим камеры по умолчанию для навигации. Изменяет угол обзора на 45 градусов и размещает камеру позади текущей позиции, направляя её в сторону движения. Во время навигации камера автоматически подстраивается под направление движения. Нажатие кнопки «Центрировать карту» также переключит вас в этот режим. Кнопка «Центрировать карту» не видна при выборе этого режима.
Обзор — Отображает общий обзор всего маршрута, масштабируя изображение по мере необходимости, чтобы маршрут поместился на карте. При выборе этого режима становится видна кнопка «Центрировать» .
Бесплатно — Позволяет пользователю менять вид карты с помощью жестов . В этом режиме камера остается неподвижной. Карта автоматически переключится в этот режим, если пользователь будет перемещать или масштабировать изображение во время навигации. При выборе этого режима становится видна кнопка «Перецентрировать» .
Чтобы изменить режим камеры, установите свойство cameraMode для представления карты, как показано здесь:
Быстрый
// 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;
Автоматическое центрирование карты
Когда пользователи перемещают карту в режиме навигации, режим камеры для просмотра карты меняется с режима слежения на свободный режим. Камера возвращается в режим слежения, когда пользователь явно нажимает кнопку «Перецентрировать» . Вы можете автоматизировать возвращение в режим слежения, используя таймер для установки интервала между выходом из режима слежения и его автоматическим возвращением.
Пример
В приведенном ниже примере кода проверяется, перемещает ли пользователь карту в режиме навигации. Если да, то устанавливается таймер для переключения режима камеры в режим слежения, центрируя карту через пять секунд.
Быстрый
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