CLLocationManager и степени направленности в iPhone
-
20-09-2019 - |
Вопрос
Используя событие didUpdateHeading объекта CLLocationManager, как мне преобразовать результирующие значения heading.x и heading.y в градусы, которые я могу нанести на изображение компаса?
Решение
Для степеней заголовков вы можете использовать magneticHeading
и trueHeading
свойства вместо x
и y
.
trueHeading
Курс (измеряется в градусах) относительно истинного севера.(только чтение)
@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, поэтому вы получаете истинный или магнитный курс в градусах.