iOS计算重力

标签 ios objective-c

很简单,我需要在我的项目中制作一个标签,说明来自加速度计的当前重力。我找到了一些代码,但我不知道将它放在我的代码中的什么位置。我猜我需要将其放入无效声明中,但我不确定。请指出正确的方向。

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/

相关文章:

ios - 在 UIView 中绘制圆框 :drawRect, 在旋转/调整大小后倾斜

ios - 使用 CTFontCreateCopyWithSymbolicTraits 更改字体样式

ios - UITapGesture 仅识别 UIImageView 边框上的点击

ios - 在 ipad 中从 popOver 推送 View

iphone - 'NSData'没有可见的@interface声明选择器

ios - 使用 Parse 的 com.facebook.sdk 错误 2 iOS 应用程序

objective-c - NSBlockOperation 的粒度状态

objective-c - Objective C 私有(private)实例变量错误

ios - 为什么 NSNumberFormatterStyle.CurrencyStyle 在 iOS 模拟器的英国 Mac 上默认为美国?

ios - 用于打开商店的模型与用于创建商店的模型不兼容 Xcode 7.1