ضبط الكاميرا

تسمح لك الكاميرا بتغيير كاميرا المستخدم. وجهة عرض الخريطة. يمكنك استخدام أوضاع الكاميرا للتحكم في سلوك الخريطة أثناء التنقل. لضبط وضع الكاميرا، يجب ضبط خاصية cameraMode في عرض الخريطة، مع تحديد أحد ثوابت وضع الكاميرا التالية:

  • التالي: وضع الكاميرا التلقائي للتنقّل. تغيير طريقة العرض زاوية إلى 45 درجة وتضع الكاميرا خلف الموضع الحالي المواجه للداخل اتجاه السفر. أثناء التنقّل، يتم ضبط الكاميرا تلقائيًا في اتجاه السفر. الضغط على زر إعادة توسيط الخريطة التبديل إلى هذا الوضع أيضًا. لن يكون زر إعادة التوسيط مرئيًا عندما يتم تحديد هذا الوضع.

  • نظرة عامة — تعرض نظرة عامة على المسار بالكامل، مع التكبير حسب الحاجة ليناسب المسار في عرض الخريطة. عند تحديد طريقة العرض هذه، زر إعادة التوسيط مرئي.

  • حرّة: تتيح للمستخدم تغيير عرض الخريطة باستخدام الإيماءات. تظل الكاميرا ثابتة في هذا العرض. ستدخل الخريطة تلقائيًا طريقة العرض هذه إذا كان المستخدم يقوم بالتحريك أو التكبير أو التصغير أثناء التنقل. عندما يكون هذا العرض حددنا زر إعادة التوسيط مرئيًا.

لتغيير وضع الكاميرا، اضبط خاصية 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