我正在尝试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];
我找到了我的问题的解决方案,但我无法理解为什么以前的代码不起作用。 我在motionHandler中只添加了一个CMAttitude变量*。
- (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];}
答案 0 :(得分:0)
我认为这是因为..如果首先定义处理程序,运动对象的attitude属性已经设置为默认值。稍后在您自己的代码中,这种态度属性变为只读。因此,当您使用此处理程序启动运动更新时,运动的姿态属性不再可以更改。但是motionManager.deviceMotion的attitude属性设置为你在startDeviceMotionUpdatesUsingReferenceFrame中指定的任何内容,当你使用startDeviceMotionUpdatesUsingReferenceFrame启动动画更新时,它会被读入一个对象。一个物体现在具有正确的姿态,而运动物体具有默认的姿态。