很简单,我需要在我的项目中制作一个标签,说明来自加速度计的当前重力。我找到了一些代码,但我不知道将它放在我的代码中的什么位置。我猜我需要将其放入无效声明中,但我不确定。请指出正确的方向。
sx = acceleration.x * kFilteringFactor + sx * (1.0 - kFilteringFactor);
sy = acceleration.y * kFilteringFactor + sy * (1.0 - kFilteringFactor);
sz = acceleration.z * kFilteringFactor + sz * (1.0 - kFilteringFactor);
float aValue = sqrt(sx*sx+sy*sy+sz*sz);
[gforcelabel setText:[NSString stringWithFormat:@"%.2f",aValue]];
最佳答案
我不会再为 UIAccelerometerDelegate 烦恼了,考虑到此时你不太可能需要保持与 iOS 5 以下的任何东西的兼容性。正如其他答案中所链接的,你会想要使用 Core Motion,特别是 CMMotionManager ,适用于 iOS 5 及更高版本。它也很容易使用,您所要做的就是创建一个运动管理器的实例(您只能有一个),设置它的更新间隔(可选),然后开始监视指定的运动事件。
if (!self.manager) {
self.manager = [CMMotionManager new];
}
if (self.manager.isAccelerometerActive) {
[self.manager stopAccelerometerUpdates];
}
NSOperationQueue *queue = [NSOperationQueue new];
[self.manager setAccelerometerUpdateInterval:1.0 / 30.0]; // 30 Updates Per Second
[self.manager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
NSLog(@"X: %f Y: %f Z: %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
}];
我提供的代码创建了一个新的操作队列,用于处理加速度计更新,如果您想从 block 内更新 UI,则必须先返回主线程。如果你没有在 block 中做任何繁重的处理,而只需要更新 UI(就像你做的那样),你可以简单地传递 [NSOperationQueue mainQueue]
,而不是创建一个新的排队。
还值得注意的是,运动管理器不仅可以监控加速度数据,还可以为磁力计、陀螺仪和设备运动提供更新 block 。信息可以在 the documentation 中找到
关于iOS计算重力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23165827/