Поверните UIView в соответствии с показаниями магнитометра iDevice

У меня есть 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 градусов, не подпрыгивая? (Я предполагаю, что это проблема радианов)


person Raptor    schedule 17.02.2015    source источник
comment
вроде все в порядке, вот ваш код, и он работает нормально (красный вид) dl.dropboxusercontent .com / u / 19438780 / testHeading.zip   -  person TonyMkenu    schedule 17.02.2015
comment
Большое спасибо за ваш демонстрационный проект! В конце концов, это моя degreeToRadians() неисправность. Смотрите мой ответ ниже!   -  person Raptor    schedule 18.02.2015


Ответы (1)


В итоге я обнаружил, что degreeToRadians() неисправен, что делает расчет радиан неверным.

// this is malfunctioned
#define degreesToRadians(degrees) (M_PI * degrees / 180.0)

// this is working, thanks @TonyMkenu
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
person Raptor    schedule 18.02.2015
comment
добро пожаловать, рад помочь вам! :) - person TonyMkenu; 18.02.2015