现在我正在使用以下代码从设备的陀螺仪中获取Euler值。这是应该如何使用的?或者,如果没有使用NSTimer,还有更好的方法吗?
- (void)viewDidLoad {
[super viewDidLoad];
CMMotionManager *motionManger = [[CMMotionManager alloc] init];
[motionManger startDeviceMotionUpdates];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:(1/6) target:self selector:@selector(read) userInfo:nil repeats:YES];
}
- (void)read {
CMAttitude *attitude;
CMDeviceMotion *motion = motionManger.deviceMotion;
attitude = motion.attitude;
int yaw = attitude.yaw;
}
答案 0 :(得分:1)
你可以使用这个......
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error)
{
CMAttitude *attitude;
attitude = motion.attitude;
int yaw = attitude.yaw;
}];
答案 1 :(得分:1)
直接引用the documentation:
以指定间隔处理动作更新
接收动作数据 在特定的时间间隔,应用程序调用一个“开始”方法,采取一个 操作队列(NSOperationQueue的实例)和块处理程序 用于处理这些更新的特定类型。运动数据是 传递给块处理程序。确定更新频率 通过“间隔”属性的值。
[...]
设备动作。设置要指定的deviceMotionUpdateInterval属性 更新间隔。打电话给或 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:或 startDeviceMotionUpdatesToQueue:withHandler:方法,传入一个 CMDeviceMotionHandler类型的块。用前一种方法(新的 iOS 5.0),您可以指定要用于的参考帧 态度估计。旋转速率数据作为传递到块中 CMDeviceMotion对象。
所以,例如。
motionManger.deviceMotionUpdateInterval = 1.0/6.0; // not 1/6; 1/6 = 0
[motionManager
startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:
^(CMDeviceMotion *motion, NSError *error)
{
CMAttitude *attitude;
attitude = motion.attitude;
int yaw = attitude.yaw;
}];
我懒得使用主队列,但这仍然是比NSTimer更好的解决方案,因为它会给运动经理一个关于你多久更新的明确线索。