私のアプリでは、ユーザーがGMSMapViewで移動している方向に沿って移動することを示す必要があるため、カスタムGMSMarkerを配置し、画像 (例: 自転車または車) を設定し、ユーザーが移動を開始して角度を変更したときにそのマーカーをアニメーション化しました。locationManager didUpdateHeadingデリゲート メソッドのマーカーは、GMSMarker 画像 (自転車または車) がユーザーの移動方向に向かって開始する必要があるためです。
以下は使用しているコードですが、ユーザーがゆっくりと移動すると動作し、速度が 40 以上の自転車や車で高速に移動すると適切に動作しません。
- (void)viewDidLoad {
[super viewDidLoad];
if(locationManager == nil) {
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = 10.0;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
[locationManager requestAlwaysAuthorization];
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
[locationManager requestWhenInUseAuthorization];
[locationManager startUpdatingLocation];
// Start heading updates.
if ([CLLocationManager headingAvailable]) {
locationManager.headingFilter = 5;
[locationManager startUpdatingHeading];
}
}
}
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
// Use the true heading if it is valid.
CLLocationDirection direction = newHeading.magneticHeading;
CGFloat radians = -direction / 180.0 * M_PI;
//For Rotate Niddle
CGFloat angle = RADIANS_TO_DEGREES(radians);
[self rotateArrowView:angle];
}
-(void)rotateArrowView:(CGFloat)degrees {
currentLocationMarker.rotation = degrees;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
// If it's a relatively recent event, turn off updates to save power.
currentLocation = [locations lastObject];
[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
currentLocationMarker.position = currentLocation.coordinate;
[CATransaction commit];
}
ユーザーが速く動いたときに適切な正確な方向を表示するために今何をすべきか教えてください。