У меня есть UIView
, содержащий некоторые точки внутри, и я заставляю его вращаться в соответствии с показаниями магнитометра через CLLocationManager
, как показано ниже:
@interface PresentationVC () {
float initialBearing;
}
@end
@implementation PresentationVC
- (void)viewDidLoad {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager startUpdatingHeading];
[self.locationManager startUpdatingLocation];
}
#pragma mark - CLLocationManager Delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
if(initialBearing == 0) {
initialBearing = newHeading.magneticHeading;
}
NSLog(@"Magnetic Heading: %f", newHeading.magneticHeading);
viewMap.transform = CGAffineTransformMakeRotation(degreesToRadians(initialBearing - newHeading.magneticHeading));
}
@end
где viewMap
- это UIView
.
Приведенный выше код работает, но я хочу, чтобы преобразование UIView
было установлено на 0 градусов / радиан, что составляет CGAffineTransformMakeRotation(0)
. В настоящее время изначально устанавливается текущий азимут, например 157 градусов.
Я пытаюсь использовать initialBearing
в приведенном выше коде для вычисления угла смещения, но он все равно сначала поворачивается на угол. Что я пропустил?
Кроме того, я не могу повернуться на 360 градусов; CGAffineTransformMakeRotation()
отскакивает от вращения, когда я вместо этого поворачиваюсь почти на 180 градусов. Как я могу повернуть на 360 градусов, не подпрыгивая? (Я предполагаю, что это проблема радианов)
degreeToRadians()
неисправность. Смотрите мой ответ ниже! - person Raptor   schedule 18.02.2015