Đ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ể dùng các chế độ camera để kiểm soát hành vi của bản đồ trong quá trình điều hướng. Để đặ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:

  • Theo dõi – Chế độ camera mặc định để chỉ đường. 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 theo hướng di chuyển. Trong quá trình chỉ đường, camera sẽ tự động điều chỉnh để hướng về phía trước. Khi nhấn nút Chỉnh tâm của bản đồ, bạn cũng sẽ chuyển sang chế độ này. Nút Định tâm 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, phóng to khi cần để vừa với tuyến đường vào chế độ xem bản đồ. Khi bạn chọn chế độ xem này, nút Định tâm lại sẽ xuất hiện.

  • Miễn phí – Cho phép người dùng thay đổi chế độ xem bản đồ bằng cử chỉ. Camera vẫn đứng yên ở chế độ xem này. Bản đồ sẽ tự động chuyển sang chế độ xem này nếu người dùng di chuyển hoặc thu phóng trong khi đi theo chỉ dẫn. Khi bạn chọn chế độ xem này, nút Định tâm lại 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ế độ Điều hướng, chế độ camera cho khung hiển thị bản đồ sẽ thay đổi từ chế độ theo dõi sang chế độ tự do. Camera sẽ chuyển về chế độ theo dõi khi người dùng nhấn rõ ràng vào nút Định tâm lại. Bạn có thể tự động chuyển về chế độ theo dõi bằng cách dùng bộ hẹn giờ để đặt khoảng thời gian giữa lúc rời khỏi chế độ theo dõi và lúc tự động chuyển về chế độ này.

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 đồ khi ở chế độ Chỉ đường hay không. Nếu có, thì phương thức này sẽ đặt mộ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