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