Используя событие didUpdateHeading объекта CLLocationManager, как мне преобразовать полученные значения heading.x и heading.y в градусы, которые я могу нанести на изображение компаса?
CLLocationManager и градусы курса в iPhone
Ответы (3)
Для степеней заголовков вы можете использовать magneticHeading
и trueHeading
вместо x
и y
.
истинный заголовок
Направление (измеряется в градусах) относительно истинного севера. (только для чтения)
@property(readonly, nonatomic) CLLocationDirection trueHeading
Обсуждение
Значение этого свойства представляет собой направление, указывающее на географический Северный полюс. Значение этого свойства всегда сообщается относительно верхней части устройства, независимо от физической или интерфейсной ориентации устройства. Значение 0 представляет истинный север, 90 — восток, 180 — юг и т. д. Отрицательное значение указывает, что заголовок не может быть определен.
Вот как я повернул uiimageview с изображением компаса. Северная стрелка изначально была направлена вверх на изображении.
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
NSLog(@"UIInterfaceOrientationLandscapeLeft");
[self.compassImageViewIphone setTransform:CGAffineTransformMakeRotation((((newHeading.magneticHeading - 90) *3.14/180)*-1) )];
}else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight){
NSLog(@"UIInterfaceOrientationLandscapeRight");
[self.compassImageViewIphone setTransform:CGAffineTransformMakeRotation((((newHeading.magneticHeading + 90) *3.14/180)*-1))];
}else if (self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
NSLog(@"UIInterfaceOrientationPortraitUpsideDown");
[self.compassImageViewIphone setTransform:CGAffineTransformMakeRotation((((newHeading.magneticHeading + 180) *3.14/180)*-1) )];
}else{
NSLog(@"Portrait");
[self.compassImageViewIphone setTransform:CGAffineTransformMakeRotation((newHeading.magneticHeading *3.14/180)*-1)];
}
Пытаться:
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
CLLocationDirection trueNorth = [newHeading trueHeading];
CLLocationDirection magneticNorth = [newHeading magneticHeading];
}
CLLocationDirection имеет typedef double, поэтому вы получаете истинный или магнитный курс в градусах.