ضبط الكاميرا

تتيح لك الكاميرا تغيير وجهة نظر المستخدم للخريطة. يمكنك استخدام أوضاع الكاميرا للتحكّم في سلوك الخريطة أثناء التنقّل. لضبط وضع الكاميرا، اضبط السمة 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