Điều chỉnh máy ảnh

Camera cho phép bạn thay đổi điểm nhìn của người dùng trên bản đồ. Bạn có thể sử dụng các chế độ camera để kiểm soát hành vi của bản đồ trong khi đi theo chỉ dẫn. Để đặt chế độ camera, hãy đặt thuộc tính cameraMode của chế độ xem bản đồ, chỉ định một trong các hằng số chế độ camera sau:

  • Theo dõi – Chế độ camera mặc định để đi theo chỉ dẫn. Thay đổi góc nhìn thành 45 độ và đặt camera phía sau vị trí hiện tại, hướng về phía trước. Trong khi đi theo chỉ dẫn, camera sẽ tự động điều chỉnh để hướng về phía bạn đang di chuyển. Khi bạn nhấn vào nút Căn giữa lại của bản đồ, chế độ này cũng sẽ được bật. Nút Căn giữa lại sẽ không xuất hiện khi bạn chọn chế độ này.

  • Tổng quan — Hiển thị thông tin tổng quan về toàn bộ tuyến đường, thu phóng khi cần để tuyến đường vừa với chế độ xem bản đồ. Khi bạn chọn chế độ xem này, nút Căn giữa lại sẽ xuất hiện.

  • Tự do – Cho phép người dùng thay đổi chế độ xem bản đồ bằng cử chỉ. Camera vẫn đứng yên trong chế độ xem này. Bản đồ sẽ tự động chuyển sang chế độ xem này nếu người dùng xoay hoặc thu phóng trong khi đi theo chỉ dẫn. Khi bạn chọn chế độ xem này, nút Căn giữa lại sẽ xuất hiện.

Để thay đổi chế độ camera, hãy đặt thuộc tính cameraMode của chế độ xem bản đồ, như minh hoạ dưới đây:

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;

Tự động căn giữa bản đồ

Khi người dùng di chuyển bản đồ ở chế độ thao tác, chế độ camera cho chế độ xem bản đồ sẽ thay đổi từ chế độ theo dõi sang chế độ tự do. Máy ảnh sẽ quay lại chế độ theo dõi khi người dùng nhấn rõ ràng vào Căn giữa lại. Bạn có thể tự động hoá việc quay lại chế độ theo dõi bằng cách sử dụng bộ hẹn giờ để đặt khoảng thời gian giữa việc rời khỏi chế độ theo dõi và sau đó tự động quay lại chế độ đó.

Ví dụ

Ví dụ về mã sau đây kiểm tra để xác định xem người dùng có đang di chuyển bản đồ khi ở chế độ thao tác hay không. Nếu đúng, thì lớp này sẽ đặt bộ hẹn giờ để chuyển chế độ camera sang chế độ theo dõi, căn giữa bản đồ sau 5 giây.

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