تتيح لك الكاميرا تغيير وجهة نظر المستخدم للخريطة. يمكنك استخدام أوضاع الكاميرا للتحكّم في سلوك الخريطة أثناء التنقّل. لضبط وضع الكاميرا، اضبط السمة cameraMode لعرض الخريطة، مع تحديد أحد ثوابت وضع الكاميرا التالية:
المتابعة: وضع الكاميرا التلقائي للتنقّل يغيّر زاوية العرض إلى 45 درجة ويضع الكاميرا خلف الموضع الحالي في اتجاه السير. أثناء التنقّل، تضبط الكاميرا تلقائيًا لتتجه نحو وجهة السفر. سيؤدي الضغط على زر إعادة التوسيط في الخريطة إلى التبديل إلى هذا الوضع أيضًا. لا يظهر زر إعادة التوسيط عند اختيار هذا الوضع.
نظرة عامة: يعرض هذا الوضع نظرة عامة على المسار بأكمله، مع التكبير حسب الحاجة لملاءمة المسار في عرض الخريطة. عند تحديد هذا العرض، يظهر الزر إعادة التوسيط.
"حر" (Free): يتيح للمستخدم تغيير عرض الخريطة باستخدام الإيماءات. تظل الكاميرا ثابتة في هذا العرض. ستدخل الخريطة تلقائيًا في طريقة العرض هذه إذا حرّك المستخدم نافذة العرض أو كبّرها أو صغّرها أثناء التنقّل. عند اختيار طريقة العرض هذه، يظهر زر إعادة التوسيط.
لتغيير وضع الكاميرا، اضبط السمة 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