ضبط الكاميرا

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