CoreMotion IOS 5 отношение со отсчета не работает - PullRequest
6 голосов
/ 27 октября 2011

Я пробую новые функции CoreMotion, прежде всего, возможность установить опорный кадр, но если я использую DeviceMotionHandler и опорный кадр установлен в CMAttitudeReferenceFrameXTrueNorthZVertical, то результатом является часть CMAttitudeReferenceFrameXArbitraryCorrectedZVertical. я запускаю приложение с iphone, всегда с одинаковым поворотом рыскания относительно моего стола, и я тестирую другой начальный поворот рыскания, но результат всегда одинаков.

motionManager = [[CMMotionManager alloc] init];
motionManager.showsDeviceMovementDisplay = YES;
motionManager.deviceMotionUpdateInterval = 1.0/60.0;    

CMDeviceMotionHandler  motionHandler = ^ (CMDeviceMotion *motion, NSError *error) {
    NSLog(@"%f      %f         %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw);
};

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];

Я нашел решение своей проблемы, но не могу понять, почему предыдущий код не работает. Я добавляю только переменную CMAttitude * a в motionHandler.

- (void)viewDidLoad
{
[super viewDidLoad];
motionManager = [[CMMotionManager alloc] init];
motionManager.showsDeviceMovementDisplay = YES;
motionManager.deviceMotionUpdateInterval = 1.0/60.0;    

CMDeviceMotionHandler  motionHandler = ^ (CMDeviceMotion *motion, NSError *error) {
    CMAttitude *a = motionManager.deviceMotion.attitude;
    labelAngle.text = [NSString stringWithFormat:@"%f      %f         %f",a.pitch, a.roll,a.yaw];
    labelAngle2.text = [NSString stringWithFormat:@"%f       %f      %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw];
};

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];}

1 Ответ

0 голосов
/ 24 ноября 2011

Я думаю, это потому, что ... если вы сначала определили обработчик, для свойства position вашего объекта движения уже установлено значение по умолчанию. Позже в вашем собственном коде это свойство отношения становится доступным только для чтения. Таким образом, при запуске обновлений движения с помощью этого обработчика свойство ориентации движения больше не может быть изменено. Но свойство position объекта motionManager.deviceMotion установлено на то, что вы указываете в startDeviceMotionUpdatesUsingReferenceFrame, и это считывается в объект при запуске обновлений движения с помощью startDeviceMotionUpdatesUsingReferenceFrame. Объект теперь имеет правильную ориентацию, а объект движения имеет настройку по умолчанию.

...