Đ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 khung hiển thị bản đồ, chỉ định một trong các hằng số chế độ camera sau:

  • Following (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 theo hướng di chuyển. Trong khi đi theo chỉ dẫn, camera sẽ tự động điều chỉnh để hướng theo hướng di chuyển. Việc nhấn vào nút Căn lại vào giữa của bản đồ cũng sẽ chuyển sang chế độ này. Nút Căn lại vào giữa sẽ không xuất hiện khi bạn chọn chế độ này.

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

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

Để thay đổi chế độ camera, hãy đặt thuộc tính cameraMode của khung hiển thị bản đồ, như minh hoạ ở đâ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 lại bản đồ vào giữa

Khi người dùng di chuyển bản đồ ở chế độ thao tác, chế độ camera cho khung hiển thị bản đồ sẽ chuyển từ chế độ theo dõi sang chế độ tự do. Camera sẽ quay lại chế độ theo dõi khi người dùng nhấn rõ ràng vào nút Căn lại vào giữa. 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, sau đó tự động quay lại chế độ đó.

Ví dụ

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